2013-08-02 51 views
0

我試圖在某些單元測試開始時啓動PHP的內置web服務器。目標是讓相同的腳本啓動Web服務器,然後連接到它來驗證我們的捲曲包裝庫的行爲是否適當。通過exec()啓動PHP網絡服務器時,curl()拒絕連接()

腳本:

<?php 
    echo "Starting server...\n"; 
    exec("php -S localhost:8000 -t /path/to/files > /dev/null & echo $!", $output); 


    $ch = curl_init("http://localhost/"); 
    curl_setopt($ch, CURLOPT_PORT, 8000); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_exec($ch); 

    if(curl_errno($ch)) 
    { 
      echo 'Curl error: ' . curl_error($ch); 
    } 

    // Close handle 
    curl_close($ch); 

    echo "PID: ".$output[0]."\n"; 
    exec('kill '.$output[0]); 
?> 

當我運行上面的腳本,我得到這個錯誤:

Curl error: Failed connect to localhost:8000; Connection refused 

注:

  • 的Web服務器不啓動,如果刪除kill在腳本的結尾我可以看到在進程列表中運行的webserver
  • 如果我開始了PHP的命令行上的Web服務器我的PHP腳本可以連接到它
  • 如果我從啓動PHP的Web服務器的另一個 PHP腳本上面的腳本可以連接到它
  • curl命令行可以連接到PHP的網絡服務器開始

我只能猜測,當一個進程嘗試連接到它的進程啓動PHP的Web服務器時,有東西被阻止或發生?

PHP 5.4.15

CentOS版本5.6(最終)

回答

2

我認爲你趕! 您可以使用「&」

然後嘗試連接開始在後臺Web服務器,但在那一刻,你的Web服務器沒有完全啓動,所以它不聽!

<?php 
    echo "Starting server...\n"; 
    exec("php -S localhost:8000 -t /path/to/files > /dev/null & echo $!", $output); 


// sleep 1-5 seconds 
sleep (5); 

$ch = curl_init("http://localhost/"); 
curl_setopt($ch, CURLOPT_PORT, 8000); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_exec($ch); 

if(curl_errno($ch)) 
{ 
     echo 'Curl error: ' . curl_error($ch); 
} 

// Close handle 
curl_close($ch); 

echo "PID: ".$output[0]."\n"; 
exec('kill '.$output[0]); 
+0

哇,簡直不敢相信它是那麼簡單!謝謝! –

+0

該死的異步! :D:D:D –