簡體   English   中英

通過exec()啟動PHP Web服務器時,PHP curl()的連接被拒絕

[英]Connection refused for PHP curl() when starting PHP webserver via exec()

我正在嘗試在某些單元測試開始時啟動PHP的內置Web服務器。 我們的目標是使用相同的腳本來啟動Web服務器,然后連接到該腳本,以驗證我們的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 ,我可以看到該Web服務器在進程列表中運行
  • 如果我在命令行上啟動PHP的網絡服務器,我的PHP腳本可以連接到它
  • 如果我從另一個 PHP腳本啟動PHP的網絡服務器,則上述腳本可以連接到該服務器
  • 從命令行curl可以連接到PHP Web服務器啟動

我只能猜測,當PHP的網絡服務器由某個進程啟動然后嘗試連接到該進程時,會阻止或發生某些事情嗎?

PHP 5.4.15

CentOS版本5.6(最終版)

我認為你着急! 您可以使用“&”在后台啟動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]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM