2

私は testResponse.php という名前の php ファイルを持っています。

<?php
 sleep(5);
 echo"go";
?>

今、私はこのように file_get_contents を使用して別のページからこのファイルを呼び出しています:

$start= microtime(true);
$opts = array('http' =>
    array(
        'method'  => 'GET',
        'timeout' => 1
    )
);

$context  = stream_context_create($opts);

$loc = @file_get_contents("http://www.mywebsite.com/testResponse.php", false, $context);
$end= microtime(true);
echo $end - $start, "\n";

出力は 5 秒を超えています。これは、タイムアウトが無視されたことを意味します... この投稿のアドバイスに従いました: stackoverflow.com/questions/3689371

しかし、ホスト名をパス (www.mywebsite.com/testResponse.php など) にすることはできず、www.mywebsite.com などのホスト名を直接指定することはできないようです。

だから私はこの目標を達成するために立ち往生しています:

制約付きでページ www.test.com/x.php のコンテンツを取得します。

  • test.com が存在しないか、ページ x.php が存在しない場合、すぐには何も返されません
  • ページは存在するが読み込みに 1 秒以上かかる場合は、中止します
  • そうでなければ、ファイルの内容を取得します

編集:ちなみに、このページ(testResponse.php)をローカルサーバーから呼び出すとうまくいくようです。そうですね、タイムアウトに 2 を掛けます。たとえば、タイムアウトに 1 を指定すると、「2.0054645」のようなエコーが返されます。でも地元からだけ...

4

1 に答える 1

4

解決策は、PHP のcURL 関数を使用することです。リンク先の他の質問では、 read timeoutsconnection timeoutsなどについて適切に説明していますが、どちらもここで探しているものではありません。への接続は常に成功するため、接続タイムアウトでさえ機能しません。testResponse.phpその後はwaitingなので、必要なのは実行タイムアウトです。ここで cURL が役に立ちます。

したがって、testResponse.php変更する必要はありません。ただし、メイン ファイルで次のコードを試してください (これはテスト済みで、私のサーバーで動作します)。

$start = microtime(true);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mywebsite.com/testResponse.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$output = curl_exec($ch);
$errno = curl_errno($ch);
if ($errno > 0) {
    if ($errno === 28) {
        echo "Connection timed out.";
    }
    else {
        echo "Error #" . $errno . ": " . curl_error($ch);
    }
}
else {
    echo $output;
}
$end = microtime(true);
echo "<br><br>" . ($end - $start);
curl_close($ch);

これは、 5 行目に表示されるオプションを使用して、cURL セッションの実行時間CURLOPT_TIMEOUTを設定します。したがって、接続がタイムアウトすると、cURL の操作タイムアウト エラーのコード$errnoと等しくなります。28残りのエラー コードはcURL ドキュメントにリストされているため、上記のスクリプトを展開してそれに応じて動作させることができます。

最後に、設定されているCURLOPT_RETURNTRANSFERオプションによりcurl_exec($ch)、セッションが成功すると、取得したページのコンテンツが設定されます。それ以外の場合は、 に等しくなりfalseます。

お役に立てれば!

編集:ステートメント設定を削除しましたCURLOPT_HEADER。私もなぜか返された内容にcurl_exec($ch)の値を設定していたような印象を受け$ch、内容が によって返されることを忘れていましたcurl_exec()

于 2013-09-18T15:41:20.707 に答える