0

いくつかの単体テストの開始時に、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

ノート:

  • killスクリプトの最後にあるを削除すると、Web サーバーは起動します
  • コマンドラインでPHPのWebサーバーを起動すると、PHPスクリプトが接続できます
  • 別のPHPスクリプトからPHPのWebサーバーを起動すると、上記のスクリプトはそれに接続できます
  • curlコマンドラインから、開始された PHP Web サーバーに接続できます

PHP の Web サーバーがプロセスによって開始され、それに接続しようとすると、何かがブロックされているか、または起こっていると推測できますか?

PHP 5.4.15

CentOS リリース 5.6 (最終版)

4

1 に答える 1

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]);
于 2013-08-02T16:53:14.453 に答える