workerman作为客户端的关闭问题

DBsan

我服务器有一个php程序用来作为客户端拉取一个websocket连接,获得想要的内容后就结束进程。
我使用 Worker::stopAll() 后,程序没有关闭而是无限重启……不知道为什么。
(在命令行里以debug模式启动就会无限循环执行-重启,直接通过浏览器访问程序的话返回500)
新手上路,感谢各位大佬帮忙看一下!

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

$worker = new Worker();

$worker->onWorkerStart = function($worker){

    $con = new AsyncTcpConnection('ws://127.0.0.1:2000');

    $con->onConnect = function(AsyncTcpConnection $con) {
        echo "ws连接成功";
        $con->send(json_encode(
                array("type"=>2)
            )
            );
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        switch (json_decode($data,true)["type"]) {
            case '2':
                //通过ws从另一个程序得到可以备份图片的命令,就备份画板状态图片,完成后结束进程
                if(copy("draw.png", "backup/".date("Y-m-d H:i:s").".png")){
                    echo "备份成功";
                }else {
                    echo "备份失败";
                }
                break;
            default:
                echo "与服务器交互失败";
                break;
        Worker::stopAll();
        }
    };
};

Worker::runAll();

?>
1213 1 0
1个回答

= - =

你是写了语法错误吗,还是说你需要的是 $con->close();

截图

  • DBsan 2022-07-21

    我是想关闭连接,同时结束脚本运行。
    我看手册里,worker类有Worker::stopAll()这个接口,描述是说用来结束进程的,但下面例子看来又好像是重启进程的
    https://www.workerman.net/doc/workerman/worker/stop-all.html

    $con->close() 我试过了,可以断开连接,但是worker实例还在进行,脚本未结束

  • walkor 2022-07-21

    Worker::stopAll() 只是停止当前进程,当前进程停止后主进程会自动拉起一个新进程替代。如果你要停止整个workerman服务,用 posix_kill(posix_getppid(), SIGINT);

  • = - = 2022-07-21

    暂时没想到是什么场景要把 master 进程给结束掉。如果结束了,什么时候要再次启动呢?

  • xuntee 2022-07-22

    看我的 处理方法
    我昨天 刚刚发现这个问题

    https://www.workerman.net/a/1377

年代过于久远,无法发表回答
🔝