如何动态的创建进程或php强制restart所有程序呢?

qq7467466

问题描述

如何动态的创建进程或php强制restart所有程序呢? 搞了一天搞吐了, 用worker_start创建的进程状态跑不起来, 通过删除主进程posix_kill(posix_getppid(), SIGUSR1); 重启也不行(通过读DB动态生成的process 不会重新启动), 通过自己写个sh,php里面执行shell 重启整个服务也不行, 裂开了

388 3 1
3个回答

efnic

目前我通过这个方法,实现增减进程。
https://www.workerman.net/q/11025
用模型事件:

  1. 当增加或者停止进程时,生成./runtime/restart.crontab;
  2. 使用系统本身的crontab,定期执行一个重启webman的php脚本

我的业务场景是实时量化交易,每个进程代表一个客户的账户。
通过上述方法,在增加账户时重启webman,达到启动进程的目的。

  • 暂无评论
efnic

./config/process.php关键代码:

$okx_process_file = __DIR__ . '/okx_process.php';
if (is_file($okx_process_file)) {
    $okx_process = include $okx_process_file;
    return $config + $okx_process;
} else {
    return $config;
}

利用模型的后置事件,动态的增减okx_process.php

    /**
     * 生成启动进程时的配置
     * @return void
     */
    public static function buildStartProcessConfig(): void
    {
        $tpl = <<<EOF
<?php

use process\AsyncOrder;

return [
PROCESS_CONFIG_CONTENT
];

EOF;
        $process = <<<EOF
    'PROCESS_NAME' => [
        'handler' => AsyncOrder::class,
        'constructor' => [
            'config' => 'PROCESS_NAME',
        ],
    ],
EOF;
        $content = '';
        $list = static::where('start_process', '=', 1)->select();
        if ($list->exists()) {
            $list->each(function (self $model, $key) use (&$content, $process) {
                $content .= str_replace('PROCESS_NAME', $model->title, $process) . PHP_EOL;
            });
        }

        $config = str_replace('PROCESS_CONFIG_CONTENT', $content, $tpl);
        if (!file_put_contents(config_path('okx_process.php'), $config)) {
            throw new RuntimeException('写进程配置失败');
        }
    }
  • qq7467466 2023-08-24

    感谢大佬的回复, 我这边已经采用了\posix_kill(posix_getppid(), SIGINT); 指令来停止主进程, 然后通过supervisord来重启进程已实现业务模式~

  • lizimu 15天前

    supervisord 只能debug模式吧?daemon会报错

JackDx

mark一下

  • 暂无评论
🔝