PHP 自 2000 年 5 月 22 日 PHP4 首次发布以来,已有很长一段时间的线程模型。
前端线程化
在Web应用程序的前端创建用户线程没有任何意义;它极难扩展。Apache Worker MPM二进制文件和mod_php使用的每个客户端模型的线程并不是你真正想要用来为网站服务的东西,当然,如果你正在使用它,你不想创建额外的线程来直接响应任何Web请求。
为什么前端的线程是一个坏主意?
您可能经常听到开发人员说前端的线程没有意义,而没有提供这种断言的理由。当您学会以所需的方式思考系统时,问题就变得很明显了:
如果客户端脚本创建 8 个线程以直接响应 Web 请求,并且 100 个客户端同时请求该脚本,则您请求硬件同时执行 800 个线程。
CPU的外观和工作方式必须非常不同,才能使这成为一个好主意。
我们能做些什么呢?
有进取心的解决方案很可能有一个面向公众的PHP网站,但系统的实际大脑是用语言编写的,这些语言对构建有进取心的解决方案所需的东西有很好的支持,例如Java,C#,C++或任何当天的语言。
您应该以相同的方式使用 pthreads;通过设计其组件彼此分离的系统,仅通过设计良好的高性能(RPC)API连接,使得设计多线程架构所固有的复杂性与面向公众的网站完全隔离,以及此类网站所需的简单,可扩展的设置。
您现在可以黑兹代码
让我们从Hello World开始:
<?php
class My extends Thread {
public function run() {
printf("Hello World\n");
}
}
/* create a new Thread */
$my = new My();
/* start the Thread */
$my->start();
/* do not allow PHP to manage the shutdown of your Threads */
/* if a variable goes out of scope in PHP it is destroyed */
/* joining explicitly ensures integrity of the data contained in an objects */
/* members while other contexts may be accessing them */
$my->join();
?>
很无聊,但我希望你读;)
因此,在实际的系统中,您并不想如此明确地创建线程,您肯定只想将任务提交给某些执行器服务,所有复杂的系统,从其多任务要求的意义上说,我见过使用这样的东西......
<?php
class My extends Threaded {
public function run() {
printf("Hello World from %s#%lu\n",
__CLASS__, Thread::getCurrentThreadId());
}
}
/* create a Pool of four threads */
/* threads in a pool are created when required */
$pool = new Pool(4);
/* submit a few tasks to the pool */
$tasks = 100;
while ($tasks--) {
$pool->submit(new My());
}
/* shutting down the pool is tantamount to joining all workers */
/* remember what I said about joining ? */
$pool->shutdown();
?>
我已经给了你非常简短的解释复杂的事情,你应该努力阅读所有你能读到的:
在这里可以找到许多例子:https://github.com/krakjoe/pthreads/tree/master/examples
免责声明:使用线程的服务器架构没有什么问题,但是当你开始创建其他线程的那一刻,你就限制了它的可扩展性和按设计执行的能力,我可以想象设计良好的架构确实具有在前端线程的能力,但这不是一件容易的事情。此外,当涉及到高性能Web目标应用程序时,线程并不是工具箱中唯一的东西。研究您的所有选择。