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;
});

猜你喜欢

转载自blog.csdn.net/sunrj_niu/article/details/129706148