【问题标题】:How to get a PHP script to stop buffering socket outputs如何让 PHP 脚本停止缓冲套接字输出
【发布时间】:2014-03-31 17:00:05
【问题描述】:

我有两个通过本地 UNIX 套接字进行通信的 PHP 脚本。一个脚本上的代码如下所示:

socket_write($client, "SomeData\n");
socket_write($client, "OtherData\n");
//wait for input, or do some 'lengthy' calculations
socket_write($client, "LastData\n");

而客户端的代码很简单

@socket_select($read,$write,$except,null);
foreach ($read as $socket) {
    echo "Received from socket: ".socket_recv($socket, $buffer, $maxBuffer, 0)."\n";
}

我的问题是对 socket_write() 的两次连续调用似乎被缓冲了,因此输出看起来像这样:

Received from socket: SomeData
OtherData
Received from socket: LastData

显然上面这没什么大不了的,但实际上,我正在传递 JSON 对象,它们是这样碰撞的:

{"response":"loginOK", "token":"123456"}{"response":"data","x":12, "y":34}

这会导致客户端出现解析错误。我不能保证某些函数会一个接一个地被调用,或者在两者之间有延迟,所以我无法可靠地将结果整理到一个 JSON 对象中。有没有办法让每个 socket_write() 调用在客户端产生一个接收事件?

【问题讨论】:

  • 你试过指定socket_write传递的数据长度吗? socket_write(resource $socket,string $buffer [,int $length=0])
  • @JBES 不,没有调用 socket_write($socket, $buffer, str_len($buffer)) 的 bean。最后,客户端由 WebSockets 客户端控制,所以我已经“修复”了大约 100 毫秒延迟的问题,但我显然更喜欢不那么丑陋的东西。
  • 您需要一些东西来刷新套接字,而 socket_ 函数没有这种能力。请参阅stackoverflow.com/questions/2917584/… - 虽然解决方案意味着更改为 fsock - php.net/manual/en/function.fsockopen.php

标签: php sockets buffer


【解决方案1】:

使用带有 PHP_NORMAL_READ 标志的 socket_read(),而不是 socket_recv()。带有此标志的 socket_read() 将在 \r 或 \n 或 \0 字节上退出并返回缓冲区读取,直到出现这些字符(但请注意,返回的字符串最后将包含退出字符!您可以使用 rtrim 读取它())。 在 socket_read() 之后,再次使用 socket_select() 检查套接字。 请看https://www.php.net/manual/en/function.socket-read.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多