2012-10-30 127 views
0

如何使用exec()函數啓動和停止PHP dev服務器?我需要這樣做才能自動化我的BDD測試。如何使用exec()啓動和停止PHP dev服務器

這會停止我的腳本的執行:

echo exec('php -S localhost:8000'); 

所以我需要一種方法來開始從PHP服務器,並能夠繼續執行我的測試。然後我也需要一種方法來阻止它從PHP。

+0

我有一個函數的名字,但:自殺() –

+0

這是因爲EXEC是一個阻塞調用。你可以使用像'proc_open':http://php.net/proc_open或'popen':http://php.net/popen – igorw

回答

1

這工作:

private function _startDevelopmentServer($pidfile) 
{ 
    $cmd = 'cd ../../public && php -S 127.0.0.1:8027 index.php'; 
    $outputfile = '/dev/null'; 
    shell_exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile)); 
    sleep(1); 
} 

private function _killDevelopmentServer($pidfile) 
{ 
    if (file_exists($pidfile)) { 
     $pids = file($pidfile); 
     foreach ($pids as $pid) { 
      shell_exec('kill -9 ' . $pid); 
     } 
     unlink($pidfile); 
    } 
} 
0

這是因爲你停止了Apache。它處理停止命令,但在此時服務器已停止,因此無法處理另一個命令,因爲服務器不在此處解析它。編寫一個shell腳本,停止並重新啓動Apache,然後從您的PHP代碼中調用該腳本。即使Apache停止,shell腳本也應該繼續執行。

我假設你的服務器是Apache。

+0

沒有。與apache完全沒有關係。他正在使用PHP 5.4內置的開發Web服務器。但是,您所說的背後的基本建議 - 在PHP之外的批處理腳本中啓動和停止服務器 - 可能是正確的解決方案。 – SDC

+3

沒有,這與Apache無關,我正在談論PHP 5.4中引入的內部開發Web服務器。檢查我的答案,我已經明白了這一點。 –