2009-02-26 27 views
6

我最近阅读了关于http://php.net/pcntl的文章,并且弄错了这些函数有多好,以及在PHP中使用多线程是否聪明,因为它不是PHP的核心功能。PHP中的多线程

我想触发不需要反馈的事件,就像手动启动cronjob执行一样。

所有这一切都应该在与Zend框架

回答

7

编写一个Web应用程序的了pcntl包工程相当精致运行 - 它只是使用了根据unix functions。唯一的缺点是,如果从Web服务器上下文中调用php,则不能使用它们。也就是说,您可以在shell脚本中使用它,但不能在网页上使用它 - 至少不能使用像calling a forking script with exec或类似的破解工具。

我刚刚找到一个解释why mod_php cannot fork的页面。基本上这是一个安全问题。

+0

该死的,我想用它在一个webapp :( – Thomaschaaf 2009-02-26 14:22:36

2

让PHP代码在多个线程中执行的唯一可能方式是将php作为线程Web服务器的模块运行,这是无用的,因为线程完全隔离且您的代码无法控制它们。据我所知,pcntl只管理进程,而不是线程。

4

这不是线程控制,这是过程控制。线程库是pthreads (POSIX threads),它不包含在PHP中,因此PHP中没有多线程功能。

由于多处理,你不能在mod_php中使用它,因为这将是一个巨大的安全漏洞(衍生进程将具有所有Web服务器的权限)。

2

如果我需要从PHP执行手动crontab执行或类似操作,我可能会使用队列。有一个数据库表,您可以附加作业。另一个来自cron或作为守护进程运行的进程在它们出现时执行作业。

另一种方法是设置一个单独的脚本并为其执行HTTP GET。这不是线程化的,但它是在PHP中另一个命令的一种方式。

例如,如果我想按需运行/usr/bin/somescript.sh,我会有一个执行系统调用的somescript.php。这将在只能从本地主机访问的虚拟主机上进行。

我会做一个套接字调用到网络服务器和GET脚本。关键是而不是在套接字上读取,所以它不会阻塞。如果我想检查返回值somescript.php,我会稍后在主脚本中执行以防止阻塞。

如果somescript.php需要很长时间才能执行(比调用脚本更长),那么当套接字关闭时,您必须做一些魔法来阻止apache杀死脚本。

1

例子(从他们的项目页面摘录):

正如2011年10月25日开始,该模块已达到“生命结束”,并有利于项目如Elysia Cron已被弃用。这个模块并不完全无用,因为受Cron MT启发的核心修补程序致力于D7。

...提供了有利的Drupal为收到匿名大多流量的网站非常显著的性能和可扩展性提升静态页面缓存。对于共享主机,这是您提高性能的最佳选择。在专用服务器上,您可能需要考虑清漆。