swoole结合项目添加定时器定时任务+使用swoole实现路由转发

swoole结合项目添加定时器定时任务

如下所示:在启动swoole server时,就可以同时启动定时器了

参考文档:https://wiki.swoole.com/#/server/methods?id=addprocess

目录结构:
在这里插入图片描述

route_server.php

<?php
use Slim\Http\Environment;
use Slim\Factory\AppFactory;
use Swoole\Coroutine;
use Swoole\Coroutine\Http\Server;
use function Swoole\Coroutine\run;
use Swoole\Process;
// 定义常量
define("ROOT", getcwd() . '/..');
define('APP', ROOT . '/app');

require ROOT . '/vendor/autoload.php';
// load functions
require APP . '/functions.php';

$http = new Swoole\Http\Server("0.0.0.0", 9999);
### 重点:通过Swoole 提供的进程管理模块,用来替代 PHP 的 pcntl
//可以方便的实现进程间通讯,支持重定向标准输入和输出,在子进程内 echo 不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
## 创建 子进程
$process = new Process(function () {
    //默认定时器在执行回调函数时会自动创建协程
    Swoole\Timer::tick(2000, function (int $timer_id) {
        echo "coro-----1 " . Coroutine::getcid() . " start\n";     
    });
    Swoole\Timer::tick(4000, function (int $timer_id) {
        echo "coro-----2 " . Coroutine::getcid() . " start\n";     
    });
});
    
$http->addProcess($process);

$http->on("start", function ($server) {
    echo "Swoole http server is started at http://0.0.0.0:8888\n";
});

//使用swoole实现路由转发
$http->on("request", function ($request, $response) {
    // Instantiate the app
    $config = require APP . '/config.php';
    $config['environment'] = function () use($request) {
        $server = [];
        foreach ($request->server as $key => $value) {
            $server[strtoupper($key)] = $value;
        }
        return new Environment($server);
    };

    $app = new \Slim\App($config);
    // Register routes
    require APP . '/routes.php';
    // Run app
    $slimResponse = $app->run(true);
    $headers = $slimResponse->getHeaders();
    foreach ($headers as $name => $values) {
        $response->header($name, implode(", ", $values));
    }
    $response->header("X-Powered-By", "Salamander");
    $response->end($slimResponse->getBody());
});

$http->start();

app.php

<?php
return [
    'settings' => [
        'displayErrorDetails' => true, // set to false in production
        'addContentLengthHeader' => false, // Allow the web server to send the content-length header,
        'determineRouteBeforeAppMiddleware' => true,

        // Renderer settings
        'renderer' => [
            'template_path' => __DIR__ . '/template/',
        ],

        // Monolog settings
        'logger' => [
            'name' => 'SEO-app',
            'path' => __DIR__ . '/../logs/app.log',
            'level' => \Monolog\Logger::DEBUG,
        ],
    ],
];
<?php
function set_api_array($errcode, $errmsg, $data = null) {
    return [
        'errcode' => $errcode,
        'errmsg' => $errmsg,
        'data' => $data
    ];
}

function env($key) {
    static $arr = [];
    if(!$arr) {
        $arr = parse_ini_file(ROOT . '/.env');
    }
    return $arr[$key];
}

/**
 * 获取slim 的配置文件数组
 * @return array|mixed
 */
function get_config_arr() {
    static $arr = [];
    if(!$arr) {
        $arr = require __DIR__ . '/config.php';
    }
    return $arr;
}

route.php

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

$homePrefix = 'App\Controller\Home\\';

$app->get('/hello/{name}', function (Request $request, Response $response, array $args) {
    $name = $args['name'];
   // sleep(5);
    $response->getBody()->write("Hello, $name");
// $this->logger->addInfo("Something interesting happened"); 

    return $response;
});

$app->get('/', function (Request $request, Response $response) {
    //sleep(5);
    $response->getBody()->write('Hello Salamander');
    return $response;
});


$app->get('/user/{uid}', function (Request $request, Response $response, $args) {
    $response->getBody()->write('Hello User:' . $args['uid']);
    return $response;
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 TP5 中结合 Swoole 实现定时任务,可以按照以下步骤进行: 1. 安装 Swoole 扩展:确保已经安装并启用了 Swoole 扩展,可以参考 Swoole 的官方文档进行安装。 2. 创建定时任务类:在 TP5 项目中创建一个定时任务类,例如 `app\command\Task`。在该类中,编写定时任务的逻辑代码。 ```php <?php namespace app\command; use think\console\Command; use think\console\Input; use think\console\Output; class Task extends Command { protected function configure() { $this->setName('task:run')->setDescription('Run the task'); } protected function execute(Input $input, Output $output) { // 定时任务逻辑代码 // 例如每隔一段时间执行某个任务 swoole_timer_tick(1000, function ($timer_id) { // 执行任务的代码 $output->writeln('Task executed...'); }); } } ``` 3. 注册定时任务:在 `app\command\command.php` 文件中注册定时任务。 ```php <?php return [ 'app\command\Task', ]; ``` 4. 运行定时任务使用 Swoole 提供的 `swoole_timer_tick` 方法来运行定时任务。在 TP5 项目的根目录下,使用命令行工具运行定时任务。 ```shell php think swoole:task run ``` 以上步骤中的示例代码是一个简单的定时任务示例,每隔一秒钟执行一次任务,并输出一条日志。你可以根据实际需求修改定时任务的逻辑代码。 需要注意的是,定时任务是在 Swoole 服务器中运行的,所以你需要先启动 Swoole 服务器,然后再运行定时任务命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值