PHP多进程的模式?

pow*_*tac 7 php multithreading asynchronous

存在哪种设计模式来实现一些PHP进程的执行以及在一个PHP进程中收集结果?

背景:
PHP中有很多大树(> 10000个条目),必须对它进行递归检查.我想减少执行时间.

Ada*_*son 11

从您的PHP脚本,您可以启动另一个脚本(使用exec)来进行处理.将状态更新保存在文本文件中,然后由父线程定期读取.

注意:为了避免php等待exec'd脚本完成,将输出传递给文件:

exec('/path/to/file.php | output.log');
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用PCNTL函数派生脚本.这使用一个php脚本,在分叉时可以检测它是父节点还是子节点并相应地操作.有一些函数可以发送/接收信号,以便在父/子之间进行通信,或者让子日志记录到文件中,父文件从该文件中读取.

pcntl_fork手册页:

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     pcntl_wait($status); //Protect against Zombie children
} else {
     // we are the child
}
Run Code Online (Sandbox Code Playgroud)

  • 我之前编写了一个Perl包装器来使用FORK(在Perl中)来执行PHP脚本并获得很好的结果. (2认同)

Emi*_*nov 9

如果您的目标是最短的时间 - 解决方案很容易描述,但实现起来并不那么简单.

您需要找到一种模式来划分工作(在这方面,您没有在问题中提供太多信息).

然后使用一个主进程fork了孩子做的工作.通常,您使用的进程总数应该在n和之间2n,其中n是机器具有的核心数.

假设这些数据将存储在文件中,您可以考虑使用非阻塞IO来最大化吞吐量.不这样做会使您的大部分进程花费时间等待磁盘.PHP有stream_select()可能对你有所帮助.请注意,使用它并非易事.

如果您决定不使用select- 增加进程数可能会有所帮助.


关于pcntl功能:我已经用它们编写了一个守护程序(一个正确的分支,更改会话ID,正在运行的用户等等),它是我编写的最可靠的软件之一.因为它为每个任务生成工作者,即使其中一个任务中存在错误,也不会影响其他任务.