2017-04-05 67 views
0

我想運行後臺過程,這是孤立的,用symfony Process組件。我無法使用kernel.terminate事件。 這就是我試圖做:Symfony的過程 - 背景任務

這過程中,我想運行:

// script.php 
$f = fopen('test'.uniqid().'.txt', 'w'); 
for ($i = 0; $i < 1000; $i++) { 
    fwrite($f, "Line $i \n"); 
    sleep(2); 
} 
fclose ($f); 

這是劇本,我想運行我的過程:

// test.php 
$command = "php script.php > /dev/null 2>&1 &"; 

$p = new \Symfony\Component\Process\Process($command); 
$p->start(); 
echo $p->getPid()."\n"; 

問題是test.php終止後,script.php不起作用。主腳本的終止會殺死所有子進程。是否有可能使用Symfony進程運行孤立的進程?

+1

什麼是你想率先實現我回答這個 – Augwa

回答

1

最簡單的方式,不使用流程組件和回落到PHP的exec:

http://php.net/manual/de/function.exec.php

exec('php script.php > /dev/null 2>&1 &'); 

對於一個更堅實的解決方案考慮類似的計劃和執行的crontab命令來啓動需要啓動的過程。

+0

我相當肯定,這將做同樣的事情OP已經在做了。 – Augwa

+1

不是。進程組件使用proc_open,它實際上爲進程組件監視的輸出返回一個資源。 exec工作不同,它的火和忘記(給予執行命令末尾的最後一個'&') – Joe

+0

確認:)感謝您瞭解了新的東西。 – Augwa

0

您可以使用帶自定義隊列的atatd)或cron。 PHP調用同步命令,將命令排入隊列以供稍後執行。 at是非常強大的unix系統的標準組件。您只需運行at now + 10 min推命令的標準輸入,那麼atd守護進程將在10分鐘內你的命令。

如果您想直接從PHP運行命令,嘗試添加殼:new Process('/bin/sh -c "php script.php &"')。我不知道Process類究竟是如何調用的命令,但是如果&不工作,在兩者之間會做的伎倆多了一個外殼(這就是exec()一樣)。