我正在尝试将耗时的任务提取到单独的进程。不幸的是,多线程似乎并不是PHP的选项,但您可以使用popen创建新的php进程。PHP popen进程限制?
用例如下:每分钟运行一次cronjob,检查是否有任何需要发送的电子邮件活动。可能需要同时发送多个广告系列,但截至目前,它只是每分钟收到一个广告系列。我想提取广告系列的发送到单独的流程,以便我可以同时发送多个广告系列。
的代码看起来是这样的(注意,这只是一个概念验证):
的crontab
* * * * * root /usr/local/bin/php /var/www/maintask.php 2>&1
maintask.php
for ($i = 0; $i < 4; $i++) {
$processName = "Process_{$i}";
echo "Spawn process {$processName}" . PHP_EOL;
$process = popen("php subtask.php?process_name={$processName} 2>&1", "r");
stream_set_blocking($process, false);
}
子任务.php
$process = $_GET['process_name'];
echo "Started sleeping process {$process}" . PHP_EOL;
sleep(rand(10, 40));
echo "Stopped sleeping process {$process}" . PHP_EOL;
现在,我遇到的问题是,popen只会在任何时候产生2个进程,而我试图产卵4.我找不出原因。似乎没有任何限制记录。也许这受到我可用内核数量的限制?
我已经用[proc_open()](http://php.net/manual/en/function.proc-open.php)成功地在过去创建多个子进程。我会看看我是否可以挖掘出代码段 –
你解决了你的问题吗?你怎么知道你的代码只能同时运行2个进程?你的文章中的代码不足以测试这个。 –
@WeeZel不幸的是,我还没有能够解决这个问题。我通过监视活动进程检查了仅有2个正在运行的进程,使用“ps -aux”。我可以看到,只要有一个subtask.php进程完成,一个新进程就会启动。 我想你是对的提供的代码。这是一个试图简单地展示我想要实现的内容,而不会公布所有会使事情过于复杂的实际代码。我会看看我是否可以对我的问题进行演示并更新原始帖子。 谢谢! –