15
$url = 'http://a.url/i-know-is-down';

//ini_set('default_socket_timeout', 5);

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 5,
        'ignore_errors' => true
        )
    )
);

$start = microtime(true);
$content = @file_get_contents($url, false, $ctx);
$end = microtime(true);
echo $end - $start, "\n";

私が得る応答は一般的に21.232秒です、約5秒であるべきではありませんか?

ini_set行のコメントを外しても、まったく役に立ちません。

4

1 に答える 1

15

読み取りタイムアウトを。で設定していますsocket_create_context。アクセスしようとしているページが存在しない場合、サーバーは接続を許可して404を提供します。ただし、サイトが存在しない場合(解決されないか、背後にWebサーバーがない場合)、file_get_contents()無視されます。まだ接続がタイムアウトしていないため、読み取りタイムアウト。

で接続タイムアウトを設定できるとは思いませんfile_get_contents最近、接続タイムアウトfsockopen()を指定できるという理由だけで使用するコードを書き直しました

$connTimeout = 30 ;
$fp = fsockopen($hostname, $port, $errno, $errstr, $connTimeout);

もちろん、fsockopenに移動するには、ループ内でfsockopenから実行する必要がありfread()、コードが少し複雑になります。ただし、を使用して読み取り中に読み取りタイムアウトを検出する場合は、より詳細に制御できます。stream_get_meta_data()

http://php.net/stream_get_meta_data

于 2010-09-11T08:25:32.210 に答える