我正在嘗試將耗時的任務提取到單獨的進程。不幸的是,多線程似乎並不是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進程完成,一個新進程就會啓動。 我想你是對的提供的代碼。這是一個試圖簡單地展示我想要實現的內容,而不會公佈所有會使事情過於複雜的實際代碼。我會看看我是否可以對我的問題進行演示並更新原始帖子。 謝謝! –