2015-08-26 21 views
4

執行Laravel/Symfony的/技工命令我需要在後臺執行Laravel長時間運行過程耗時Twitter的流API。實際上,我需要運行的php工匠CLI命令是在背景

nohup php artisan startStreaming > /dev/null 2>&1 & 

如果我自己在命令行中運行它,它可以很好地工作。

這個想法是,我可以通過執行開始流式傳輸的長時間運行artisan命令(需要在後臺運行,因爲Twitter Streaming連接永遠不會結束)來啓動網站上的按鈕。通過命令行工作正常。

調用命令編程但是不起作用。我已經嘗試通過另一個命令的callSilent()靜默地調用它,並嘗試使用Symfony \ Component \ Process \ Process來運行artisan命令或運行一個運行上述命令的shell腳本,但我無法弄清楚它。

更新 如果我排隊這將打開流連接的命令,它會導致處理超時的隊列工作

我有效地需要一種方式來運行,從一個PHP類/腳本上面的命令,但PHP腳本不等待該命令的完成/輸出。

幫助非常感謝

+0

多久該命令的過程中運行?它是無限的嗎? – Jeemusu

+0

是無限期 – ExoticChimp

+0

使用'工匠::調用(「startStreaming」);'來執行它的路線上不起作用? – Jeemusu

回答

8

默認將在當前工作目錄內執行提供的命令,getcwd() symfony的過程構件。

getcwd()返回的值不會是Laravel安裝目錄(包含artisan的目錄),因此該命令很可能會返回artisan: command not found消息。

Process Component documentation中沒有提及它,但是如果您看一下class file,我們可以看到該構造允許我們提供一個目錄作爲第二個參數。

public function __construct(
    $commandline, 
    $cwd = null, 
    array $env = null, 
    $input = null, 
    $timeout = 60, array 
    $options = array()) 

你可以通過提供第二個參數,當你初始化類異步執行所需的命令:

use Symphony\Component\Process\Process; 

$process = new Process('php artisan startStreaming > /dev/null 2>&1 &', 'path/to/artisan'); 
$process->start(); 
+0

運行Artisan隊列不會成功運行該命令,但是它會阻塞隊列工作者,因爲Artisan命令運行的進程從未實際完成(Twitter流API是一個永久永不結束的連接)。 ,這個過程將會超時 – ExoticChimp

+0

也許應該說明這個過程無限期地運行,而不是在你原來的問題中使用術語「長時間運行」 – Jeemusu

+0

@Jeemusu你能告訴我這裏的'路徑/到/工匠'是什麼?我已經將laravel項目安裝目錄的路徑設置爲第二個參數?我收到以下錯誤消息:無法打開輸入文件:artisan –

0

如何通過Laravels排隊命令的執行集結在隊列中?

+0

排隊是不需要的,因爲問題是在後臺執行的命令不會導致隊列工作者在執行作業時超時。使用Symphony進程組件使我能夠在後臺運行該命令 – ExoticChimp