【问题标题】:PHP socket_read() only returns 1 stringPHP socket_read() 只返回 1 个字符串
【发布时间】:2017-08-11 14:42:27
【问题描述】:

我使用下面的脚本连接到外部 PBX 服务器并获取通话记录。

但是,它一次只返回 1 个刺痛,等于 1 个日志。所以我需要多次刷新才能得到所有可用的日志。

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die();
$result = socket_connect($socket, $address, $port) or die();

$out = socket_read($socket, 2048);

如何获得所有可用的字符串,而不必一直重新启动连接?

【问题讨论】:

    标签: php sockets pbx


    【解决方案1】:

    可能您的意思是循环从套接字读取? 根据文档 (http://php.net/socket_read),您可以执行类似 while ($portion = socket_read($socket, 2048)) { do_something_with_that_portion_of_log; } 的操作,如果数据用尽,您将得到空字符串或 FALSE(如果发生错误)。

    最终解决方案

    我们使用socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=> 10, 'usec'=> 0)); 和默认的非阻塞模式。读取所有日志后,程序将等待约 10 秒并完成。

    https://gist.github.com/mihalicyn/533273e0d8b23de33aaf7f2cf0973d88

    【讨论】:

    • 它不起作用。页面只是不停地加载。什么可能导致它这样做?我想遍历所有记录并将它们全部获取。每次我调用 socket 时,我都会得到 1 个字符串作为回报。
    • 您可以使用socket_set_nonblock($socket); 设置读取操作的非阻塞模式。这是 php 文档问题。 :(
    • 当我尝试var_dump($portion); 时,我现在得到bool(false)。有什么线索吗?
    • 您可以使用 socket_last_error 函数 (php.net/manual/ru/function.socket-last-error.php) 来获取错误代码和 socket_strerror 到它的字符串表示。 ;) 当套接字中的数据用完时,你可能得到了 SOCKET_EWOULDBLOCK。
    • 我得到:Couldn't create socket: [11] Resource temporarily unavailable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2014-11-30
    • 2014-10-23
    • 2018-05-15
    • 2012-09-09
    • 2013-04-12
    相关资源
    最近更新 更多