使用stream_socket_client防止DNS超时

Code110

在使用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
将本文下载保存,方便收藏和打印
导出文档