Php ngnix不完全地将数据传输到unix域套接字

Php ngnix不完全地将数据传输到unix域套接字,php,linux,nginx,unix-socket,Php,Linux,Nginx,Unix Socket,我的应用程序正在unix域套接字(UDS)上侦听传入数据,而nginx正在使用PHP发送数据。发送几KB的较小数据块效果很好,但一旦达到一定限制,浏览器就会收到错误504网关超时,nginx日志 读取响应时上游超时(110:连接超时) 来自上游的头,客户端:127.0.0.1,服务器:\请求:“获取” /foo/bar.php HTTP/1.1“,上游: "fastcgi://unix:/run/php/php7.0-fpm.sock”,主机:“本地主机” 套接字仍然会获得一些数据(总是在1.5

我的应用程序正在unix域套接字(UDS)上侦听传入数据,而nginx正在使用PHP发送数据。发送几KB的较小数据块效果很好,但一旦达到一定限制,浏览器就会收到错误
504网关超时
,nginx日志

读取响应时上游超时(110:连接超时) 来自上游的头,客户端:127.0.0.1,服务器:\请求:“获取” /foo/bar.php HTTP/1.1“,上游: "fastcgi://unix:/run/php/php7.0-fpm.sock”,主机:“本地主机”

套接字仍然会获得一些数据(总是在1.5MB左右剪切)和回复,但Web服务器似乎没有得到响应。 是否存在任何必须调整的UDS流限制或nginx变量

PHP代码:

public function send ($msg)
{
    $str = "{$msg}".chr(27);

    $ret = socket_write($this->socket, $str, strlen($str));

    if ($ret == FALSE)
    {
        return false;
    }
    else
    {
        $response = "";

        while (($chunk = socket_read($this->socket, 2048, PHP_BINARY_READ)) !== FALSE)
        {
            $response .= $chunk;

            if (substr($chunk, -1) == chr(27))
                break;
        }

        //close the connection
        if ($this->connected !== false)
        {
            socket_shutdown($this->socket);
            socket_close($this->socket);
            $this->connected = false;
        }

        return $response;
    }
}

该错误表示Nginx和上游服务器之间的连接超时

您的请求是否需要超过1分钟才能完成

尝试根据以下内容更改nginx位置并阅读


对于staters来说,Nginx与这个问题没有任何关系,很明显,这是PHP发送和接收数据的过程

您的远程系统很可能没有在正确的时间关闭套接字,或者只是需要很长时间才能响应

while (($chunk = socket_read($this->socket, 2048, PHP_BINARY_READ)) !== FALSE)
{
    $response .= $chunk;
    if (substr($chunk, -1) == chr(27))
    break;
}
如果远程系统没有关闭连接/套接字并告诉您它将继续尝试读取并等待2048(位或字节-我永远记不起它要求的大小,确保注释会通知),则此代码块有可能成为此代码的无限循环在读取完成之前,要通过的数据量或要关闭的套接字数

因此,要降低读取字节数,需要做几件事,将其设置为类似于
128
,在套接字中放入计时器(需要在PHP中进行异步编程)读取,以便在28秒后将其杀死,再给代码2秒时间执行(安全退出)。或者使用
set\u time\u limit
增加您的时间限制


如果您确实增加了时间限制,则需要增加允许nginx从连接到PHP获取响应的时间量,以便设置
fastcgi\u read\u timeout

“504网关超时”意味着负载平衡器(或代理)已断开TCP连接,即使仍然存在未完成的流量。我不应该直接连接。你应该显示你的代码。几年前,我在模块中编程一个处理程序时遇到了很大的困难。Nginx并没有让它变得简单,还有很多需要改进的地方。我添加了代码就是这样。我的应用程序没有正确关闭连接(不是PHP)。由于一个bug,它只适用于不超过缓冲区大小的短流。谢谢@怀疑者Jule如果您的远程系统没有在正确的时间关闭套接字,那么您是否可以将此标记为答案
while (($chunk = socket_read($this->socket, 2048, PHP_BINARY_READ)) !== FALSE)
{
    $response .= $chunk;
    if (substr($chunk, -1) == chr(27))
    break;
}