欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php get_headers 判断回来是否是200 碰到不存在的脚本执行超时

程序员文章站 2022-04-04 19:49:37
...
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(!@fwrite($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; 
php get_headers 判断回来是否是200 碰到不存在的脚本执行超时

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频