ホームページ  >  記事  >  バックエンド開発  >  php get_headers は、戻り値が 200 で、存在しないスクリプト実行タイムアウトが発生したかどうかを判断します。

php get_headers は、戻り値が 200 で、存在しないスクリプト実行タイムアウトが発生したかどうかを判断します。

WBOY
WBOYオリジナル
2016-06-13 13:21:021261ブラウズ

php get_headers は、戻り値が 200 であるかどうかを判断します。存在しないスクリプト実行タイムアウト
と存在しない IP アドレスが発生した場合、関数がタイムアウトするまで応答を待ちます。これにより、ページが遅延し、表示できません。

ストリームを開けませんでした: HTTP リクエストが失敗しました!
致命的なエラー: 最大実行時間 30 秒を超えました

Set ini_set('max_execution_time', 10);
この関数を使わずに自分でソケットを書いてみませんか? 面倒なので他に良い方法はありますか?



--- ---解決策- ------------------

ディスカッション
彼に常に実行させることはできません。最大 5 秒間実行してから停止させることはできますが、間違えないでください。 🎜>

------解決策---------

話し合う
こんにちは、csdn は遅くて古いことが判明しました。応答が出てから長い時間が経ちました。

しばらくお待ちください。 5 秒です。いいえ、結果を取得する必要はありません。次の値を直接判断するだけです。
set_time_limit(5) このように使用すると、プログラムは直接停止します


------解決策------------------
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;
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。