您好,欢迎访问一九零五行业门户网

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

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 codefunction 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;

其它类似信息

推荐信息