Maison  >  Article  >  développement back-end  >  Comment LaravelS accélère Laravel/Lumen via Swoole

Comment LaravelS accélère Laravel/Lumen via Swoole

不言
不言original
2018-06-22 09:54:122530parcourir

Cet article vous présente principalement les informations pertinentes sur LaravelS accélérant Laravel/Lumen via Swoole. L'article le présente en détail à travers l'exemple de code. Il a une certaine valeur d'apprentissage de référence pour les études ou le travail de chacun. ensemble Étudier et étudier.

LaravelS - Debout sur les épaules de géants

Cet article présente principalement le contenu associé de LaravelS pour accélérer Laravel/Lumen via Swoole. À propos de : fusée : Accélérez Laravel/Lumen via Swoole, où le S signifie Swoole, vitesse et hautes performances.

Caractéristiques

  • Swoole haute performance

  • Construit -dans le serveur Http

  • Mémoire résidente

  • Redémarrage en douceur

  • Prend en charge à la fois Laravel et Lumen, Compatible avec les versions grand public

  • Simple, prêt à l'emploi prêt à l'emploi

Si cela vous aide, Star Me LaravelS

Exigences

依赖 说明
PHP >= 5.5.9
Swoole >= 1.7.19 推荐最新的稳定版 从2.0.12开始不再支持PHP5
Laravel / Lumen >= 5.1
Gzip[可选的] zlib , 检查本机libz是否可用 ldconfig -p|grep libz

Installation

1. (packagiste)

# 在你的Laravel/Lumen项目的根目录下执行
composer require "hhxsv5/laravel-s:~1.0" -vvv
# 确保你的composer.lock文件是在版本控制中

2. Ajouter un fournisseur de services

Laravel : Modifier le fichier config/app.php

'providers' => [
 //...
 Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,
],

Lumen : Modifier le fichier bootstrap/app .php

$app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);

3. Publier le fichier de configuration

php artisan laravels publish

Cas particulier : Vous n'avez pas besoin de charger manuellement la configuration laravels.php, la couche inférieure de LaravelS a été chargée automatiquement.

// 不必手动加载,但加载了也不会有问题
$app->configure('laravels');

4. Modifiez la configuration config/laravels.php : surveillance de l'IP, du port, etc., veuillez vous référer aux éléments de configuration.

Exécuter

php artisan laravels {start|stop|restart|reload|publish}
命令 说明
start 启动LaravelS,展示已启动的进程列表 ps -ef|grep laravels
stop 停止LaravelS
restart 重启LaravelS
reload 平滑重启所有worker进程,这些worker进程内包含你的业务代码和框架(Laravel/Lumen)代码,不会重启master/manger进程
publish 发布配置文件到你的项目中 config/laravels.php

Utiliser avec Nginx

upstream laravels {
 server 192.168.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
 #server 192.168.0.2:5200 weight=3 max_fails=3 fail_timeout=30s;
 #server 192.168.0.3:5200 backup;
}
server {
 listen 80;
 server_name laravels.com;
 root /xxxpath/laravel-s-test/public;
 access_log /yyypath/log/nginx/$server_name.access.log main;
 autoindex off;
 index index.html index.htm;
 
 # Nginx处理静态资源,LaravelS处理动态资源。
 location / {
  try_files $uri @laravels;
 }

 location @laravels {
  proxy_http_version 1.1;
  # proxy_connect_timeout 60s;
  # proxy_send_timeout 60s;
  # proxy_read_timeout 120s;
  proxy_set_header Connection "keep-alive";
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_pass http://laravels;
 }
}

Écoute événements

Habituellement, vous pouvez réinitialiser ou détruire certaines variables globales ou statiques dans ces événements, ou modifier la requête et la réponse actuelles.

laravels.received_request convertit swoole_http_request en IlluminateHttpRequest avant que le noyau Laravel ne traite la requête.

// 修改`app/Providers/EventServiceProvider.php`, 添加下面监听代码到boot方法中
// 如果变量$exents不存在,你也可以调用\Event::listen()。
$events->listen('laravels.received_request', function (\Illuminate\Http\Request $req) {
 $req->query->set('get_key', 'hhxsv5');// 修改querystring
 $req->request->set('post_key', 'hhxsv5'); // 修改post body
});

laravels.generated_response Une fois que le noyau Laravel a traité la requête, IlluminateHttpResponse est converti en swoole_http_response (l'étape suivante sera de répondre au client).

$events->listen('laravels.generated_response', function (\Illuminate\Http\Request $req, \Symfony\Component\HttpFoundation\Response $rsp) {
 $rsp->headers->set('header-key', 'hhxsv5');// 修改header
});

Utilisez l'instance swoole_http_server dans votre projet

/**
* @var \swoole_http_server
*/
$swoole = app('swoole');// Singleton
var_dump($swoole->stats());

Notes

Recommandé Obtenir les informations de la demande via l'objet IlluminateHttpRequest. Il est compatible avec $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE et $_REQUEST et $_ENV ne peut pas être utilisé.

public function form(\Illuminate\Http\Request $request)
{
 $name = $request->input('name');
 $all = $request->all();
 $sessionId = $request->cookie('sessionId');
 $photo = $request->file('photo');
 $rawContent = $request->getContent();
 //...
}

Il est recommandé de répondre à la requête en renvoyant l'objet IlluminateHttpResponse, qui est compatible avec echo, vardump(), print_r(). Vous ne pouvez pas utiliser de fonctions comme exit(),

<.>
die()、header()、setcookie()、http_response_code()。
public function json()
{
 return response()->json([&#39;time&#39; => time()])->header(&#39;header1&#39;, &#39;value1&#39;)->withCookie(&#39;c1&#39;, &#39;v1&#39;);
}
global que vous déclarez, les variables statiques doivent être nettoyées ou réinitialisées manuellement.


L'ajout infini d'éléments à des variables statiques ou globales entraînera une saturation de la mémoire.

// 某类
class Test
{
 public static $array = [];
 public static $string = &#39;&#39;;
}

// 某控制器
public function test(Request $req)
{
 // 内存爆满
 Test::$array[] = $req->input(&#39;param1&#39;);
 Test::$string .= $req->input(&#39;param2&#39;);
}

TODO

  • Pool de connexions pour MySQL/Redis.

  • Client Coroutine qui encapsule MySQL/Redis/Http.

  • Prise en charge automatique de la coroutine pour Swoole 2.1+.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Comment utiliser le framework Laravel pour implémenter la fonction de recherche

Comment le framework Laravel implémente le Fonctionnement CURD de la couche modèle

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn