为什么我post过来的数据想转发给过去,但是返回值为NUlLL,我看了下表示放入待发送队列,等待异步发送,怎么能立即发送出去呢

ssxzcb
<?php
use \Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
require_once './Workerman/Autoloader.php';

//远程CCS地址
$REAL_CCS_ADDRESS = 'tcp://xx.xx.xx.xx:80';

// 监听本地4237端口
$proxy = new Worker('http://0.0.0.0:4237');

$proxy->onConnect = function($connection)
{
    global $REAL_CCS_ADDRESS;
    // 异步建立一个到实际ccs服务器的连接
    $connection_to_css = new AsyncTcpConnection($REAL_CCS_ADDRESS);
    // ccs连接发来数据时,转发给对应客户端的连接
    $connection_to_css->onMessage = function($connection_to_css, $buffer)use($connection)
    {
        var_dump($buffer);
        $connection->send($buffer);
    };
    // ccs连接关闭时,关闭对应的代理到客户端的连接
    $connection_to_css->onClose = function($connection_to_css)use($connection)
    {
        $connection->close();
    };
    // ccs连接上发生错误时,关闭对应的代理到客户端的连接
    $connection_to_css->onError = function($connection_to_css)use($connection)
    {
        $connection->close();
    };

    // 执行异步连接
    $connection_to_css->connect();

    // 客户端发来数据时,转发给对应的ccs连接
    $connection->onMessage = function($connection, $buffer)use($connection_to_css)
    {
        $buffer = $_POST;
        var_dump($connection_to_css->send($buffer));
    };
    // 客户端连接断开时,断开对应的ccs连接
    $connection->onClose = function($connection)use($connection_to_css)
    {
        $connection_to_css->close();
    };
    // 客户端连接发生错误时,断开对应的ccs连接
    $connection->onError = function($connection)use($connection_to_css)
    {
        $connection_to_css->close();
    };

};
// 运行worker
Worker::runAll();
2469 1 0
1个回答

walkor

workerman提供的网络IO接口都是异步的。
返回null 说明发生了下面两种情况其中的一种
1、远程链接还没有连上就开始向远程链接发送数据。
2、由于发送的数据大于socket缓冲区的大小或者socket缓冲区已满导致有部分数据未发送,这时未发送的数据放入待发送队列,等待socket缓冲区有空余位置时再将数据放入进去发送。

如果想得到发送的确切结果,那么只能阻塞等待,这样会导致只要有一个socket慢(链接慢或者接收数据慢)就会导致整个服务卡死。

另外也不是你想发送就能立即发送的,涉及到网络环境以及者客户端自身等很多因素。例如网络暂时不可用、客户端bug无法接受数据导致对应socket缓冲区一直是满的等等都。

  • 暂无评论
年代过于久远,无法发表回答
🔝