无法捕获 PHP 套接字连接的响应 :: 504 Gateway Time-out

Posted

技术标签:

【中文标题】无法捕获 PHP 套接字连接的响应 :: 504 Gateway Time-out【英文标题】:Unable to capture response of PHP Sockets Connection :: 504 Gateway Time-out 【发布时间】:2014-04-01 23:31:39 【问题描述】:

我正在使用以下 php 代码通过 php sockets 连接连接并向远程服务器发送请求。

<?php 
$host    = "X.X.X.X";
$port    = 1234;
$message = "<request>test</request>";
echo "Message To server :".$message;
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");  
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
// get server response
stream_set_timeout($socket, 10);
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
//echo "Reply From Server  :".$result;
$info = stream_get_meta_data($socket);
if (isset($info['timed_out']) && $info['timed_out'])

    echo 'Connection timed out!';

else

    var_dump($result);

// close socket
socket_close($socket);
?>

正如确认的那样,远程机器正在接收我们的请求并在同一会话中向我们发送适当的响应。但不幸的是,执行脚本时我收到以下响应 -

504 网关超时。服务器没有及时响应。

当从 Putty(执行代码的同一服务器)尝试时,我几乎立即(不到一秒)得到响应。

没有运行会阻止响应的防火墙。如 telnet 请求和响应所示,所有 *** 流量都通过隧道,没有任何阻塞。

现在我无法弄清楚没有通过这个 php 脚本获得响应的确切原因。我浏览了许多教程和示例代码,但没有找到运气。 :(

会员,请帮忙。

【问题讨论】:

【参考方案1】:

我曾使用 php 套接字来模拟远程登录会话,而无需设置超时参数。试试下面的,让我知道进展如何

<?php

// You can use socket_strerror(socket_last_error()) to get the error details
$socket = socket_create(AF_INET,SOCK_STREAM,0) or die ('Could not create socket') ;

$result = socket_connect($socket,$host,$port) or die ('Could not connect to host');

// The server expects the enter key to pressed to execute the command which i simulate by
// appending a \n to the message sent to the server

socket_send($socket,$message,strlen($message),0) or die('Could not execute command');

$result = socket_read($socket,2048) or die('Could not read from socket');

var_dump($result);

【讨论】:

【参考方案2】:

这可能已经过时,但The PHP manual 上的注释说:

如果有人感到困惑,stream_set_timeout 不适用于使用 socket_create 或 socket_accept 创建的套接字。请改用 socket_set_option。

代替:

<?php
stream_set_timeout($socket,$sec,$usec);
?>

用途:

<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>

【讨论】:

更新代码后,脚本仍未捕获远程服务器发送的响应并超时。【参考方案3】:

尝试将socket_read中的读取模式设置为PHP_NORMAL_READ

【讨论】:

以上是关于无法捕获 PHP 套接字连接的响应 :: 504 Gateway Time-out的主要内容,如果未能解决你的问题,请参考以下文章

php504错误

nginx 将数据不完整地传输到 unix 域套接字

Reactjs 无法建立套接字连接,它在调用 componentDidMount 时打开并获得响应

未捕获的类型错误:尝试使用 PHP 填充响应式数据表时无法读取未定义的属性“长度”?

在适用于 PHP 的 Google BigQuery API 中捕获“响应太大而无法返回错误”的正确方法是啥?

502 503 504