国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman與TP框架command結合,只能執(zhí)行一個worker 文件的問題

vasileon

我使用TP框架的command 結合 workerman 來使用。
具體是在command里新建2個文件,然后通過php think PriceOkex start 、php think PriceBinance start 來啟動,發(fā)現(xiàn)只能啟動一個,另一個直接報錯說worker已經(jīng)在執(zhí)行了。報錯內(nèi)容
Workerman[think] start in DEBUG mode
Workerman[think] already running
應該是 入口文件 think 重名了,有沒有什么方式讓workerman 以 think文件后面一個參數(shù)(比如上面的PriceOkex、PriceBinance)作為這個key ?

文件內(nèi)容如下

<?php
declare (strict_types=1);
namespace app\command;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Worker;

class PriceOkex extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('PriceOkex')
            ->addArgument('action', Argument::OPTIONAL,
                "start|stop|restart|reload|status|connections", 'start')
            ->addOption('mode', 'm', Option::VALUE_OPTIONAL,
                'Run the workerman server in daemon mode.')
            ->setDescription('the workerman command');
    }
    protected function execute(Input $input, Output $output)
    {
        // 指令輸出
        $output->writeln('convert start');
        $action = $input->getArgument('action');
        $mode = $input->getOption('mode');
        // 重新構造命令行參數(shù),以便兼容workerman的命令
        global $argv;
        $argv = [];
        array_unshift($argv, 'think', $action);
        if ($mode == 'd') {
            $argv[] = '-d';
        } else {
            if ($mode == 'g') {
                $argv[] = '-g';
            }
        }
        $worker_1 = new Worker();
        $worker_1->name = 'PriceOkex';
        $worker_1->id = 2;
        $worker_1->onWorkerStart = function ($worker) {
            $pRedis = Predis::getInstance();
            $con = new AsyncTcpConnection('ws://ws.okx.com:8443/ws/v5/public');
            $con->transport = 'ssl';
            $con->onConnect = function (AsyncTcpConnection $con) {
            };
            $con->onMessage = function (AsyncTcpConnection $con, $data) use (
                $pRedis
            ) {
            };
            $con->connect();
        };
        Worker::runAll();
    }
}

另一個文件如下

<?php
declare (strict_types=1);
namespace app\command;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Worker;

class PriceBinance extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('PriceBinance')
            ->addArgument('action', Argument::OPTIONAL,
                "start|stop|restart|reload|status|connections", 'start')
            ->addOption('mode', 'm', Option::VALUE_OPTIONAL,
                'Run the workerman server in daemon mode.')
            ->setDescription('the workerman command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 指令輸出
        $output->writeln('convert start');
        $action = $input->getArgument('action');
        $mode = $input->getOption('mode');
        // 重新構造命令行參數(shù),以便兼容workerman的命令
        global $argv;
        $argv = [];
        array_unshift($argv, 'think', $action);
        if ($mode == 'd') {
            $argv[] = '-d';
        } else {
            if ($mode == 'g') {
                $argv[] = '-g';
            }
        }
        $worker_1 = new Worker();
        $worker_1->name = 'PriceBinance';
        $worker_1->id = 1;
        $worker_1->onWorkerStart = function ($worker) {
            $pRedis = Predis::getInstance();
            $con
                = new AsyncTcpConnection('ws://stream.binance.com:9443/ws/btcusdt@aggTrade');
            $con->transport = 'ssl';
            $con->onConnect = function (AsyncTcpConnection $con) {
            };
            $con->onMessage = function (AsyncTcpConnection $con, $data) use (
                $pRedis
            ) {
            };
            $con->connect();
        };
        Worker::runAll();
    }
}
5526 4 0
4個回答

2548a

你這種做法類似于想復制N份 start.php ,然后想
php start.php start -d
php start1.php start -d
php start2.php start -d

按我個人理解,你這種做法是不正確的,thinkphp里面,如果想定義多個worker 服務,
,正確做法是在配置的worker_class 里面設置自定義服務
'worker_class' => [],
// 自定義Workerman服務類名 支持數(shù)組定義多個服務

  • 暫無評論
walkor 打賞

如果沒有指定Worker::$pidFile,workerman會根據(jù)啟動的文件名字來生成一個pid文件,thinkphp命令行里就是用thinkphp來自動生成一個pid文件。這樣當執(zhí)行stop status等命令時,就能找到主進程的pid,才能和對應的進程交互。

php think PriceOkex start 、php think PriceBinance start 這2個命令使用的是相同的thinkphp文件,所以pid一樣,無法重復啟動。

解決辦法是根據(jù)參數(shù)不同,設置不同的Worker::$pidFile。
比如php think PriceOkex start時代碼里動態(tài)設置 Worker::$pidFile = '/var/run/PriceOkex.pid';,這樣用thinkphp命令行啟動多個服務,互相不影響。

  • zijin 2022-06-18

    我在laravel 5.5 commands中使用Workerman遇到了同樣的問題,兩個不同的command,都設置了各自不同的pidFile,但是在使用 php artisan 啟動其中一個時,另外一個也會被啟動,此時只有一個pidFile生成,但是兩個command中的Worker進程都被啟動了

admin

應該全部寫成servers,然后A::run();B::run();Worker::runAll();

  • 暫無評論
vasileon

感謝各位幫助! 謝謝

  • zijin 2022-06-18

    你這個問題解決了嗎,我在laravel中遇到了同樣的問題,并且設置pidFile也不起作用

年代過于久遠,無法發(fā)表回答
??