Swoole 是一款优秀的 PHP 扩展,利用其可以实现原生 PHP 很难做到的常驻服务和异步。正好我有个 Laravel 项目可以折腾,就研究了下。
Laravel 项目是基于 composer 的,所以我先帖下我的 composer.json 中的 require 声明:
{
"require": {
"php": "^7.1.3",
"cybercog/laravel-love": "^5.1",
"dingo/api": "~v2.0.0-alpha2",
"doctrine/dbal": "^2.8",
"fideloper/proxy": "^4.0",
"guzzlehttp/guzzle": "^6.3",
"infyomlabs/adminlte-templates": "5.6.x-dev",
"infyomlabs/laravel-generator": "5.6.x-dev",
"jeroennoten/laravel-adminlte": "^1.23",
"laravel/framework": "5.6.*",
"laravel/tinker": "^1.0",
"laravelcollective/html": "^5.6.0",
"lshorz/luocaptcha": "^1.0",
"overtrue/laravel-lang": "v3.0.08",
"overtrue/laravel-wechat": "^4.0",
"predis/predis": "^1.1",
"spatie/laravel-permission": "^2.17",
"tymon/jwt-auth": "~1.0.0-rc.2",
"yajra/laravel-datatables-buttons": "^4.0",
"yajra/laravel-datatables-oracle": "^8.7"
}
}
如果我们要开启 swoole,我们可选的包有这些:
但一般来说,项目中需要常驻容器的服务与每次均需重新构建的服务并不一样,所以我才剑走偏锋。
起步
我们需要将 public/index.php
替换成如下
<?php
use Illuminate\Http\Request;
use Illuminate\Http\Response;
define('LARAVEL_START', microtime(true));
require __DIR__ . '/../vendor/autoload.php';
$app = require_once __DIR__ . '/../bootstrap/app.php';
class Laravel
{
/**
* Illuminate\Foundation\Application
*
* @var \Illuminate\Foundation\Application
*/
public $app;
/**
* App\Http\Kernel
*
* @var \App\Http\Kernel
*/
public $kernel;
/**
* App\Http\Requests\Request
*
* @var \App\Http\Requests\Request
*/
public $request;
/**
* Illuminate\Http\JsonResponse
*
* @var \Illuminate\Http\JsonResponse
*/
public $response;
/**
* 构造
*
* @param \Illuminate\Foundation\Application $app
*/
public function __construct(\Illuminate\Foundation\Application $app)
{
$this->app = $app;
}
/**
* RUN
*
* @return void
*/
public function run()
{
\Swoole\Runtime::enableCoroutine(true);
$http = new swoole_http_server('127.0.0.1', '80');
$http->set([
'document_root' => public_path('/'),
'enable_static_handler' => true,
]);
$http->on('request', function ($req, $res) {
try {
$kernel = $this->app