php get_headers 判斷回來是否是200 碰到不存在的指令碼執行逾時

來源:互聯網
上載者:User
php get_headers 判斷返回是否是200 碰到不存在的指令碼執行逾時
不存在的IP網址,會一直等待響應,直到函數逾時,導致頁面遲遲無法顯示。

failed to open stream: HTTP request failed!
Fatal error: Maximum execution time of 30 seconds exceeded

設定了 ini_set('max_execution_time', 10);還一樣

要不不用這個函數自己寫socket了,用這個函數的curl_init,麻煩,各位有啥別好的方法沒


------解決方案--------------------
探討

我可不行讓他一直在那執行,最多執行5秒,就讓他停了,但是別抱錯誤

------解決方案--------------------
探討

暈,csdn原來越遲鈍了,老了,回複個多長時間了還沒出來

我可不想讓php一直執行下去,給他個時間比如5秒,沒出結果就不要了,直接判斷下面的就行
set_time_limit(5)這樣用的話,程式就直接停止了

------解決方案--------------------
resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
最後一個參數 $timeout設為5,即可設定最大連線時間5秒,到期函數返回,程式並不會退出
------解決方案--------------------
思路是樓上的,get_headers 只能說php這個函數不完善,咱只有用socket自己寫了
由於不能給自己分,我用另外的帳號登陸了,以下是完整代碼,也給別人做做貢獻了
PHP code
function DoGet($url){    $url2 = parse_url($url);    if(!isset($url2['path']))$url2['path']='';    $url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);    $url2["port"] = (isset($url2["port"])?$url2["port"]:80);    $host_ip = @gethostbyname($url2["host"]);    $fsock_timeout =2;  //2 second    if(!($fsock = fsockopen($host_ip, $url2["port"], $errno, $errstr, $fsock_timeout)))    {//        echo 'fsockopen fail';        return false;    }    $request =  $url2["path"] .(isset($url2["query"]) ? "?".$url2["query"] : "");            $in  = "GET " . $request . " HTTP/1.0\r\n";    $in .= "Accept: */*\r\n";    $in .= "User-Agent: Payb-Agent\r\n";    $in .= "Host: " . $url2["host"] . "\r\n";    $in .= "Connection: Close\r\n\r\n";            stream_set_timeout( $fsock , $fsock_timeout ) ;        if([email protected]($fsock, $in, strlen($in))){        //echo 'fwrite fail';        fclose($fsock);        return false;    }    $status = stream_get_meta_data( $fsock ) ;    //發送資料逾時    if($status['timed_out'] )    {    //    echo "Write time out" ;        fclose( $fsock );        return false;    }        $out = null;    while($buff = @fgets($fsock, 2048))    {        $out .= $buff;        //唯讀取頭部資訊        if(false!==strpos($out, "\r\n\r\n"))break;    }        $status = stream_get_meta_data( $fsock ) ;    //讀取資料逾時    if( $status['timed_out'] )    {//        echo "Read time out" ;        fclose( $fsock );        return false;    }    fclose($fsock);        $pos = strpos($out, "\r\n\r\n");    $head = substr($out, 0, $pos);    //http head    return $head;}$rs= DoGet("http://www.ba05afasdfsiddf08usfa.com");if(!$rs)echo 'fail';else echo $rs;
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.