我最近阅读了http://php.net/pcntl,并且知道这些函数的效果如何,以及在PHP中使用多线程是否明智,因为它不是PHP的核心功能。
我想要触发不需要反馈的事件,比如手动触发cronjob执行。
所有这些都应该在使用Zend Framework
编写的Web应用程序中运行答案 0 :(得分:7)
pcntl包工作得很好 - 它只使用了unix functions。唯一不足的是,如果从Web服务器上下文调用php,则无法使用它们。即你可以在shell脚本中使用它,但不能在网页上使用它 - 至少不使用calling a forking script with exec或类似的黑客攻击。
[编辑] 我刚刚找到一个解释why mod_php cannot fork的页面。基本上这是一个安全问题。 [/编辑]
答案 1 :(得分:4)
这不是线程控制,这是过程控制。线程的库是pthreads (POSIX threads),它不包含在PHP中,因此PHP中没有多线程函数。
从多处理开始,你不能在mod_php中使用它,因为这将是一个巨大的安全漏洞(生成的进程将具有所有web服务器的权限)。
答案 2 :(得分:2)
在多个线程中执行php代码的唯一可能方法是将php作为线程Web服务器的模块运行,这是无用的,因为线程完全隔离且您的代码无法控制它们。据我所知,pcntl只管理进程,而不是线程。
答案 3 :(得分:2)
如果我需要从PHP执行手动crontab执行等,我可能会使用队列。有一个附加作业的数据库表。另一个进程,无论是来自cron还是作为守护进程运行,都会在它们出现时执行这些作业。
另一种方法是设置一个单独的脚本并对其执行HTTP GET。它不是线程,但它是在PHP中对另一个命令进行炮轰的一种方式。
例如,如果我想按需运行/usr/bin/somescript.sh
,我会有somescript.php
进行系统调用。这将位于只能从localhost访问的虚拟主机上。
我会对网络服务器进行套接字调用并获取脚本。关键是不在套接字上读取,因此它不会阻塞。如果我想检查somescript.php
的返回值,我稍后会在主脚本中执行此操作以防止阻塞。
如果somescript.php
需要很长时间才能执行(比调用脚本更长),那么当套接字关闭时,你必须做一些魔术来阻止apache杀死脚本。
答案 4 :(得分:2)
Multiplatform PHP多线程引擎 http://anton.vedeshin.com/articles/lightweight-and-multiplatform-php-multithreading-engine
答案 5 :(得分:1)
在PHP中工作的多线程示例(带有项目页面的摘录):
截至2011年10月25日,该模块已达到“生命周期结束”,并且已弃用,以支持Elysia Cron等项目。这个模块并非完全没用,因为受Cron MT启发的核心补丁已经致力于D7。
...为Drupal提供静态页面缓存,为主要接收匿名流量的站点提供非常显着的性能和可扩展性。对于共享主机,这是提高性能方面的最佳选择。在专用服务器上,您可能需要考虑使用Varnish。