使用stream_socket_client防止DNS超时
在使用PHP的stream_socket_client进行网络通信时,可能会遇到DNS解析超时的问题,这是因为在默认情况下,stream_socket_client会尝试进行DNS解析,如果DNS服务器无法解析主机名,就会抛出一个异常。
常用代码:
<?php $host = 'www.lyplugin.com'; $port = 80; $errno = 0; $errstr = ''; $socket = stream_socket_client("tcp://$host:$port", $errno, $errstr, 30); if (!$socket) { echo "$errstr ($errno)<br /> "; } else { echo "Connected to server<br />"; stream_set_timeout($socket, 10); // 设置超时时间为10秒 while (!feof($socket)) { echo fgets($socket, 128); } $socket = null; } ?>
优化代码:
<?php $host = 'www.lyplugin.com'; $port = 80; $errno = 0; $errstr = ''; $timeout = 10; // 设置超时时间 $context = stream_context_create([ 'socket' => [ 'bindto' => '0:0', // 绑定到任意可用接口 'connect_timeout' => $timeout, // 设置连接超时时间 'dns' => ['lyplugin.com' => '93.184.216.34'], // 设置DNS服务器地址 ], ]); $socket = @stream_socket_client("tcp://{$host}:{$port}", $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context); if (!$socket) { echo "$errstr ($errno)<br /> "; } else { echo "Connected to server<br />"; while (!feof($socket)) { echo fgets($socket, 128); } $socket = null; } ?>
在这个优化代码中,我们创建了一个包含socket选项的上下文,并设置了连接超时时间和DNS服务器地址,这样,即使DNS解析超时,也可以在连接超时时间内完成连接。
《 使用stream_socket_client防止DNS超时》.doc
将本文下载保存,方便收藏和打印
导出文档