3

我有一个使用套接字的 php 脚本,当我在 localhost (XAMPP) 上测试它时,我的代码运行良好。但是在我将相同的代码上传到我的虚拟主机后,它无法正常工作。详细地说,它加载了几分钟,最后给出了这些错误消息。

Warning: socket_connect() [function.socket-connect]: unable to connect [110]: Connection timed out in /home/....

Warning: socket_send() [function.socket-send]: unable to write to socket [32]: Broken pipe in /home/....

Warning: socket_read() [function.socket-read]: unable to read from socket [107]: Transport endpoint is not connected in /home/....

我认为这可能是因为服务器阻止了套接字连接。我的问题是:

  1. 我可以执行一些代码来检查服务器是否阻止它吗?(例如 phpinfo() )
  2. 我应该关注哪些服务器配置才能尝试使其连接?(我可以访问 .htaccess 文件但不能访问 php.ini)
  3. 套接字连接是否需要 SSL?
  4. 如果我最终因为服务器设置无法解决这个问题,我需要另一个虚拟主机。我应该注意“计划列表”上的哪些功能/关键字?

我知道有很多问题,但我希望有人可以帮助我。如果有人能给我一些建议,非常感谢。

4

2 回答 2

1

这很奇怪……据我所知,实际上没有特定的 INI 指令来启用/禁用套接字连接。有一个设置超时的指令(default_socket_timeout),但我怀疑它可以改变任何东西。

SSL 与套接字无关。除非您使用可能依赖 SSL 的协议(例如 HTTP)。

服务器 TCP 配置更有可能阻止访问远程主机上的某些 TCP 端口。在安全性和资源使用更严格的共享托管计划中,通常会出现这种情况。

如果您可能找到连接到标准端口(例如 80)的方法,您会发现是否必须与您的托管服务提供商打交道或去其他地方:)

尝试在您的主机上执行以下代码。查找此问题是否与网络配置有关可能会有所帮助

//just in case
if (!extension_loaded('sockets')) {
    die('The sockets extension is not loaded.');
}

echo '<p><strong>Establishing connection...</strong></p>';
$socket = socket_create(AF_INET,SOCK_STREAM,0);
if (!socket_connect($socket, "stackoverflow.com", 80))
{
    die('Socket error : '.socket_strerror(socket_last_error()));
}

echo '<p><strong>Connection successful!</strong></p>';

$request = join("\n",array(
    "GET / HTTP/1.1",
    "Connection: close",
    "Host: stackoverflow.com",
    "User-Agent: Mozilla/5.0 (Windows NT 6.1)",
    "Accept: text/html,*/*;q=0.8",
    ""));
socket_write($socket,$request,strlen($request));

$response = socket_read($socket,2048);


echo "<p><strong>This is the received data : </strong></p>";
echo '<pre>'.htmlentities($response).'</pre>';

socket_close($socket);
于 2012-09-16T13:39:25.303 回答
1
$options = array( 'http' => array(

    'user_agent'    => 'toixen',        // who am i
    'max_redirects' => 10,              // stop after 10 redirects
    'timeout'       => 2,               // timeout on response
    ) );


$context = stream_context_create( $options );

$url = "http://toixen_1:123@btcguild.com:8332";  
$dh = fopen( "$url",'r',false,$context);

fwrite($dh, "post");

$result = fread($dh,8192);                                                                                                                             
echo $result
于 2013-04-21T03:39:43.100 回答