php get_headers は、戻り値が 200 であるかどうかを判断します。存在しないスクリプト実行タイムアウト
と存在しない IP アドレスが発生した場合、関数がタイムアウトするまで応答を待ちます。これにより、ページが遅延し、表示できません。
ストリームを開けませんでした: HTTP リクエストが失敗しました!
致命的なエラー: 最大実行時間 30 秒を超えました
Set ini_set('max_execution_time', 10);
この関数を使わずに自分でソケットを書いてみませんか? 面倒なので他に良い方法はありますか?
--- ---解決策- ------------------
------解決策---------
話し合う
------解決策------------------
resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )最後のパラメータ $ Set timeout を 5 に設定すると、最大接続時間を 5 秒に設定します。期限切れの関数は戻り、プログラムは終了しません。
------解決策------------------
PHP の get_headers 関数は完璧ではないとしか言えません。 自分にポイントを与えることができないので、次のとおりです。完全なコードは他の人にも使用できます。
PHP コード
。
関数 DoGet($url)
{
$url2 = parse_url($url);
if(!isset($url2['path']))$url2['path']='';
$url2["パス"] = ($url2["パス"] == "" ? "/" : $url2["パス"]);
$url2["ポート"] = (isset($url2["ポート"])?$url2["ポート"]:80);
$host_ip = @gethostbyname($url2["host"]);
$fsock_timeout =2 //2秒;
if(!($fsock = fsockopen($host_ip, $url2["port"], $errno, $errstr, $fsock_timeout)))
{
// エコー 'fsockopen 失敗';
false を返します。
}
$request = $url2["パス"] .(isset($url2["クエリ"]) ? "?".$url2["クエリ"] : "");
$in = "GET " . $request ";
$in .= "受け入れる: */*rn";
$in .= "ユーザーエージェント: Payb-Agentrn";
$in .= "ホスト: " . $url2["ホスト"] .
$in .= "接続: 閉じるrnrn";
stream_set_timeout( $fsock , $fsock_timeout ) ;
if(!@fwrite($fsock, $in, strlen($in))){
//エコー 'fwrite 失敗';
fclose($fsock);
false を返します。
}
$status = stream_get_meta_data( $fsock );
// データ送信タイムアウト
if($status['timed_out'] )
{
// エコー "書き込みタイムアウト" ;
fclose( $fsock );
false を返します。
}
$out = null;
while($buff = @fgets($fsock, 2048))
{
$out .= $buff;
//ヘッダー情報のみを読み取る
if(false!==strpos($out, "rnrn"))break;
}
$status = stream_get_meta_data( $fsock );
// データ読み取りタイムアウト
if( $status['timed_out'] )
{
// エコー「読み取りタイムアウト」 ;
fclose( $fsock );
false を返します。
}
fclose($fsock);
$pos = strpos($out, "rnrn");
$head = substr($out, 0, $pos); //http ヘッド
$head を返します。
}
$rs= DoGet("http://www.ba05afasdfsiddf08usfa.com");
if(!$rs)echo '失敗';
それ以外の場合は $rs;