主要记录了由普通PHP开发者初步接触laravelS是所遇到的一些小坑
LaravelS介绍
1 2 3 4 5 6
| _ _ _____ | | | |/ ____| | | __ _ _ __ __ ___ _____| | (___ | | / _` | '__/ _` \ \ / / _ \ |\___ \ | |___| (_| | | | (_| |\ V / __/ |____) | |______\__,_|_| \__,_| \_/ \___|_|_____/
|
LaravelS是一个能够使普通的laravel项目尽快的享受上swoole的优势的laravel插件
官方描述:
🚀LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能、更多可能性。
GitHub地址:
文档地址:
laravel-s/README-CN.md
Laravel-China地址:
LaravelS - 基于 Swoole 加速 Laravel/Lumen - 带你飞 🚀
安装
安装要求
依赖 | 说明 |
---|
PHP | >= 5.5.9 推荐PHP7+ |
Swoole | >= 1.7.19 从2.0.12开始不再支持PHP5 推荐4.2.3+ |
Laravel/Lumen | >= 5.1 推荐5.6+ |
安装swoole
详细请参考 swoole安装
安装laravel
可以通过composer直接安装,或者安装安装器或者直接从GitHub拷贝源代码来安装
安装laravelS
- 通过Composer安装
1 2
| composer require "hhxsv5/laravel-s:~3.0" -vvv # 确保你的composer.lock文件是在版本控制中
|
- 注册
Service Provider
- Laravel: 修改文件
config/app.php
,Laravel 5.5+支持包自动发现,你应该跳过这步
1 2 3 4
| 'providers' => [ Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class, ],
|
- Lumen: 修改文件`bootstrap/app.php`
1
| $app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);
|
- 发布配置文件.
1
| php artisan laravels publish
|
如果你用的是lumen
,不需要加载config/laravels.php
1 2
| $app->configure('laravels');
|
- 修改配置
config/laravels.php
请参考laravelS配置项
运行
1
| php artisan laravels {start|stop|restart|reload|publish}
|
命令 | 说明 |
---|
start | 启动LaravelS 。选项-d 或--daemonize 以守护进程的方式运行,此选项将覆盖laravels.php 中swoole.daemonize 设置 |
stop | 停止LaravelS |
restart | 重启LaravelS ,支持选项-d 或--daemonize |
reload | 平滑重启所有worker 进程,这些worker 进程内包含你的业务代码和框架(Laravel/Lumen )代码,不会重启master/manger 进程 |
publish | 发布配置文件到你的项目中config/laravels.php |
ps:展示已经启动的项目:
ps -ef|grep laravels
配置nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| gzip on; gzip_min_length 1024; gzip_comp_level 2; gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml; gzip_vary on; gzip_disable "msie6"; upstream laravels { # By IP:Port server 127.0.0.1:9100 weight=5 max_fails=3 fail_timeout=30s; #这里配置的是laravelS监听的接口参数 # By UnixSocket Stream file #server unix:/xxxpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s; #server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s; #server 192.168.1.2:5200 backup; } server { listen 80; server_name laravels.com; #为了给nginx定位静态资源 root /xxxpath/laravel-s-test/public; # Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。 location / { try_files $uri @laravels; }
location @laravels { 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 X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header Server-Protocol $server_protocol; proxy_set_header Server-Name $server_name; proxy_set_header Server-Addr $server_addr; proxy_set_header Server-Port $server_port; proxy_pass http://laravels; } }
|
配置Apache
ps:我用的是nginx,没有实际配置过,就直接把官方文档里的拿过来了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| LoadModule proxy_module /yyypath/modules/mod_deflate.so <IfModule deflate_module> SetOutputFilter DEFLATE DeflateCompressionLevel 2 AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml </IfModule>
<VirtualHost *:80> # 别忘了绑Host哟 ServerName www.laravels.com ServerAdmin [email protected]
DocumentRoot /xxxpath/laravel-s-test/public; DirectoryIndex index.html index.htm <Directory "/"> AllowOverride None Require all granted </Directory>
LoadModule proxy_module /yyypath/modules/mod_proxy.so LoadModule proxy_module /yyypath/modules/mod_proxy_balancer.so LoadModule proxy_module /yyypath/modules/mod_lbmethod_byrequests.so.so LoadModule proxy_module /yyypath/modules/mod_proxy_http.so.so LoadModule proxy_module /yyypath/modules/mod_slotmem_shm.so LoadModule proxy_module /yyypath/modules/mod_rewrite.so
ProxyRequests Off ProxyPreserveHost On <Proxy balancer://laravels> BalancerMember http://192.168.1.1:8011 loadfactor=7 #BalancerMember http://192.168.1.2:8011 loadfactor=3 #BalancerMember http://192.168.1.3:8011 loadfactor=1 status=+H ProxySet lbmethod=byrequests </Proxy> #ProxyPass / balancer://laravels/ #ProxyPassReverse / balancer://laravels/
# Apache处理静态资源,LaravelS处理动态资源。 RewriteEngine On RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$ balancer://laravels/%{REQUEST_URI} [P,L]
ErrorLog ${APACHE_LOG_DIR}/www.laravels.com.error.log CustomLog ${APACHE_LOG_DIR}/www.laravels.com.access.log combined </VirtualHost>
|
自定义的异步任务
此特性依赖Swoole
的AsyncTask
,必须先设置config/laravels.php
的swoole.task_worker_num
。
异步事件的处理能力受Task
进程数影响,需合理设置task_worker_num
。
任务结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| namespace App\Task\Message;
use App\Traits\Push; use Hhxsv5\LaravelS\Swoole\Task\Task;
class Reply extends Task { private $data;
public function __construct($data) { $this->data = $data; }
public function handle() { } }
|
ps: 任务里没有依赖注入这种便捷的东西
投递任务
1 2 3 4 5 6
|
$task = new \App\Task\Message\Reply($dat);
\Hhxsv5\LaravelS\Swoole\Task\Task::deliver($task);
|
laravelS配置项
listen_ip
:string
监听的IP,监听本机127.0.0.1
(IPv4) ::1
(IPv6),监听所有地址 0.0.0.0
(IPv4) ::(IPv6), 默认127.0.0.1
。
listen_port
:int
监听的端口,如果端口小于1024则需要root权限,default 5200
。
socket_type
:默认SWOOLE_SOCK_TCP
。通常情况下,无需关心这个配置。若需Nginx代理至UnixSocket Stream
文件,则需修改为SWOOLE_SOCK_UNIX_STREAM
,此时listen_ip
则是UnixSocket Stream
文件的路径。
enable_gzip
:bool 当通过LaravelS响应数据时,是否启用gzip压缩响应的内容,依赖库zlib
,通过命令php --ri swoole|grep zlib
检查gzip
是否可用。如果开启则会自动加上头部Content-Encoding
,默认false
。如果存在代理服务器(例如Nginx),建议代理服务器开启gzip
,LaravelS
关闭gzip,避免重复gzip
压缩。
server
:string
当通过LaravelS
响应数据时,设置HTTP
头部Server
的值,若为空则不设置,default LaravelS
。
handle_static
:bool
是否开启LaravelS
处理静态资源(要求 Swoole >= 1.7.21
,若Swoole >= 1.9.17
则由Swoole自己处理),默认false
,建议Nginx
处理静态资源,LaravelS
仅处理动态资源。静态资源的默认路径为base_path('public')
,可通过修改swoole.document_root
变更。
laravel_base_path
:string
Laravel/Lumen
的基础路径,默认base_path()
,可用于配置符号链接。
inotify_reload.enable
:bool
是否开启Inotify Reload
,用于当修改代码后实时Reload
所有worker
进程,依赖库inotify
,通过命令php --ri inotify
检查是否可用,默认false
,建议仅开发环境开启,修改监听数上限。
inotify_reload.watch_path
:string
Inotify
监控的文件路径,默认有base_path()
。
inotify_reload.file_types
:array
Inotify
监控的文件类型,默认有.php
。
inotify_reload.log
:bool
是否输出Reload
的日志,默认true
。
websocket.enable
:bool
是否启用WebSocket
服务器。启用后WebSocket
服务器监听的IP
和端口与Http
服务器相同,默认false
。
websocket.handler
:string
WebSocket
逻辑处理的类名,需实现接口WebSocketHandlerInterface
,参考示例。
sockets
:array
配置TCP/UDP
套接字列表,参考示例。
processes
:array
配置自定义进程列表,参考示例。
events
:array
自定义的异步事件和监听的绑定列表,参考示例。
swoole_tables
:array
定义的swoole_table
列表,参考示例。
register_providers
:array
每次请求需要重新注册的Service Provider
列表,若存在boot()
方法,会自动执行。一般用于清理注册了单例的ServiceProvider
。
1 2 3 4 5 6
| 'register_providers' => [ \Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ],
|