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)
如果您的目标是最短的时间 - 解决方案很容易描述,但实现起来并不那么简单.
您需要找到一种模式来划分工作(在这方面,您没有在问题中提供太多信息).
然后使用一个主进程fork了孩子做的工作.通常,您使用的进程总数应该在n和之间2n,其中n是机器具有的核心数.
假设这些数据将存储在文件中,您可以考虑使用非阻塞IO来最大化吞吐量.不这样做会使您的大部分进程花费时间等待磁盘.PHP有stream_select()可能对你有所帮助.请注意,使用它并非易事.
如果您决定不使用select- 增加进程数可能会有所帮助.
关于pcntl功能:我已经用它们编写了一个守护程序(一个正确的分支,更改会话ID,正在运行的用户等等),它是我编写的最可靠的软件之一.因为它为每个任务生成工作者,即使其中一个任务中存在错误,也不会影响其他任务.