像laravel里面command的Kernel,直接写command里面任务,如php webman test:test 这样
试了可以在task里面可以这样写 new Crontab('/1 ', function () { system("php webman test:test"); });
不知道有没更好的办法
webman是常驻内存的,crontab是随着webman启动就会自动启动的,又不需要command
创建 app/command/Test.php 命令文件
app/command/Test.php
<?php namespace app\command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; class Test extends Command { protected static $defaultName = 'test:test'; protected static $defaultDescription = 'test test'; protected function configure() { $this->addArgument('name', InputArgument::OPTIONAL, 'Name description'); } protected function execute(InputInterface $input, OutputInterface $output) { $name = $input->getArgument('name'); $output->writeln('Hello test:test'); return self::SUCCESS; } }
创建 app/process/Task.php 独立任务文件
app/process/Task.php
<?php namespace process; use Workerman\Crontab\Crontab; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; class Task { public function onWorkerStart() { // 每5秒执行一次 new Crontab('*/5 * * * * *', function(){ echo date('Y-m-d H:i:s')."\n"; global $cli; $command = $cli->find('test:test'); // 如果该命令有参数或选项,需要传入 // $arguments = [ // 'name' => 'Fabien', // '--yell' => true, // ]; $arguments = []; $greetInput = new ArrayInput($arguments); $output = new BufferedOutput(); $returnCode = $command->run($greetInput, $output); $content = $output->fetch(); var_dump($returnCode); var_dump($content); }); } }
虽然不是很优雅,你可以给 webman/console 提交一个 PR ,比如写一个函数来获取 $cli 命令行应用实例。
webman/console
PR
$cli
<?php namespace app\command; use GatewayWorker\BusinessWorker; use GatewayWorker\Gateway; use GatewayWorker\Register; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Workerman\Worker; use Symfony\Component\Console\Input\InputArgument; class GatewayCommand extends \Symfony\Component\Console\Command\Command { protected static $defaultName = 'config:gateway'; protected static $defaultDescription = 'gateway服务配置'; protected function configure() { $this // 命令的名称 ("php console_command" 后面的部分) //->setName('model:create') // 运行 "php console_command list" 时的简短描述 ->setDescription('Create new model') // 运行命令时使用 "--help" 选项时的完整命令描述 ->setHelp('This command allow you to create models...') // 配置一个参数 ->addArgument('name', InputArgument::REQUIRED, 'what\'s model you want to create ?'); } protected function execute(InputInterface $input, OutputInterface $output) { global $argv; // $argv[2] = 'start'; $argv[3] = '-d'; $output->writeln('gateway服务配置信息如下:'); $this->startGateWay(); $this->startBusinessWorker(); $this->startRegister(); Worker::runAll(); return self::SUCCESS; } private function startBusinessWorker() { $worker = new BusinessWorker(); $worker->name = 'BusinessWorker'; $worker->count = 1; $worker->registerAddress = '127.0.0.1:1237'; $worker->eventHandler = app_path() . "/service/Events.php"; } private function startGateWay() { $gateway = new Gateway("websocket://0.0.0.0:2347"); $gateway->name = 'Gateway'; $gateway->count = 4; $gateway->lanIp = '127.0.0.1'; $gateway->startPort = 40001; $gateway->pingInterval = 30; $gateway->pingNotResponseLimit = 0; $gateway->pingData = '{"type":"ping"}'; $gateway->registerAddress = '127.0.0.1:1237';//正式 1237 测试 1236 } private function startRegister() { new Register('text://0.0.0.0:1237'); } }
command的逻辑封装到service里,command 、crontab、controller等等都可以调用
可以试试 https://www.workerman.net/plugin/42
试了可以在task里面可以这样写
new Crontab('/1 ', function () {
system("php webman test:test");
});
不知道有没更好的办法
webman是常驻内存的,crontab是随着webman启动就会自动启动的,又不需要command
创建
app/command/Test.php
命令文件创建
app/process/Task.php
独立任务文件虽然不是很优雅,你可以给
webman/console
提交一个PR
,比如写一个函数来获取$cli
命令行应用实例。command的逻辑封装到service里,command 、crontab、controller等等都可以调用
可以试试 https://www.workerman.net/plugin/42