stream_set_timeout 设置超时无效 fread依然超时

接口超时502 bad gate way

超时限制失效

页面调用接口的时候,响应10s。通过使用xhprof监控,发现是调用接口超时。但是实际上接口超时的时候最多只允许2s,通过stream_set_timeout进行了读流超时限制。

查询手册

手册中有一些例子,其中有一段是这样说的:

If you are using fsockopen() to create a connection, first going to write into the stream and then waiting for the reply (e.g. simulating HTTP request with some extra headers), then stream_set_timeout() must be set only after the write - if it is before write, it has no effect on the read timeout :-( 

但是实际上,按照这种写法进行了逻辑修改,依然是无效的。

我改怎么解决这个问题呢?

阅读 4.5k
1 个回答

除了设置 stream_set_timeout 以外,还要用 stream_get_meta_data 判断是否超时。

相关文档:
https://www.php.net/manual/zh...
https://blog.csdn.net/rainday...

演示代码:

        $fp = @fsockopen( $ip , $port, $errNo , $errstr, 30 );
        if( !$fp )
        {
            return false;
        }
        else
        {    stream_set_timeout( $fp , 3 ) ;   

            //发送数据
            fwrite( $fp , $packet ) ;
            $status = stream_get_meta_data( $fp ) ;
            //发送数据超时
            if( $status['timed_out'] )
            {
                echo "Write time out" ;
                fclose( $fp );
                return false;
            }

            //读取数据
            $buf = fread( $fp , 16 ) ;
            $status = stream_get_meta_data( $fp ) ;
            //读取数据超时
            if( $status['timed_out'] )
            {
                echo "Read time out" ;
                fclose( $fp );
                return false;
            }
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏