windows workerman作为 客户端 tcp模拟http请求后,显示 @@@child exit@@@ Worker process terminated并直接退出

ken124
$worker->onConnect = function($connection){
    $connection->onMessage = function( $connection ){
        $host = "xxx.xxx.xxx.xxx:xxx";
        $bw = "POST / HTTP/1.1
Host:$host
Connection:keep-alive
Content-Type:application/json;charset=UTF-8
Content-Length:0

";

        $http_connect = new AsyncTcpConnection("tcp://$host");

        $http_connect->onConnect = function( $connection ) use ( $bw ){
            echo "握手成功";
            $connection->send( $bw );
        };

        $http_connect->onMessage = function( $http_connection , $response ) use ( $connection ){
            var_dump( $response );
            $http_connection->close();
            $connection->send( $response );
            $connection->close();
        };

        $http_connect->connect();

        return ;

    };
};

简略代码如上
环境 windows 10,php8 , 命令行 php server.php 启动
可以获取到服务端的信息,但是马上就显示
@@@child exit@@@
Worker process terminated
然后 主程序关闭
日志 也只显示
pid:1 Worker process terminated

有试过 try catch 在不同 闭包下 捕获,没有任何异常

本人使用学习 workerman 仅三周 ,欢迎指正

阅读 160
4个回答

ken124

刚看完TI10, 回来补充下 开发的想法,我发现自己弯没转过来,既然 workerman 的 http请求 我自己做不好,那我就用老办法 curl 或 fsockopen啊,明天试试

  • 暂无评论
喵了个咪

看看是不是哪里执行exit die 了,我这测试没出现啥错误。下面是测试代码和结果

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker('http://0.0.0.0:12345');
$worker->onConnect = function($connection){
    $connection->onMessage = function( $connection ){
        $host = "baidu.com";
        $bw = "POST / HTTP/1.1
Host:$host
Connection:keep-alive
Content-Type:application/json;charset=UTF-8
Content-Length:0

";
        $http_connect = new AsyncTcpConnection("tcp://$host");
        $http_connect->onConnect = function( $connection ) use ( $bw ){
            echo "握手成功";
            $connection->send( $bw );
        };
        $http_connect->onMessage = function( $http_connection , $response ) use ( $connection ){
            var_dump( $response );
            $http_connection->close();
            $connection->send( $response );
            $connection->close();
        };
        $http_connect->connect();
        return ;
    };
};
Worker::runAll();

测试结果。
截图

  • ken124 2021-10-18

    如果是这样的话,我大概率可以确定是php.ini 或者 是 php 是否为安全线程有关了

ken124

@喵了个咪:

你的代码没问题,我也能获取 结果,
但是马上就 显示
@@@child exit@@@
Worker process terminated

所以,经过一个下午的排查 ,php.ini 没问题,所以 我现在怀疑 是不是 跟 php的 安全线程有关 或者 是 event 扩展版本 有关,

问下 你的 evnet 扩展版本 和 php是 TS 还是 NTS

ken124

在 喵了个咪 的帮助下,经过验证,就是因为我加入了 evnet扩展 导致的

总结来说

windows10 , php8 加 event扩展(版本号为 3.0.6和3.0.5)这个前提下

导致 用 AsyncTcpConnection 对象 tcp模拟http请求之后 程序会退出

  • 暂无评论