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