homestead + laravel + laravels 安装过程

参考http://www.imleslie.com/topics/101
Swoole 是一个向生产环境的 PHP 异步网络通信引擎,使用 Swoole 加速 Laravel 应用,是一个很不错的思路。

搜索一下相关的扩展包有这么两个:

hhxsv5/laravel-s —— https://github.com/hhxsv5/laravel-s ;
laravel-swoole —— https://github.com/swooletw/laravel-swoole 。

这两个扩展包都是可以解决问题的,而且 star 数量也很多,作者都更新的很积极,所以选择一个你觉得合适的就行。我们先来了解一下 hhxsv5/laravel-s,完成 Homestead 以及 Laradock 两个环境中的基础安装。这节课先来了解一下 Homestead 中的基础安装,也就是普通的 Linux 环境中的安装。

安装 Swoole 扩展

首先需要安装 swoole 扩展,如果你使用的是 Homestead ,或者是一个 Linux 环境,直接使用 pecl 安装就可以了。

提升一下权限,使用 root

$ sudo -s
$ pecl install swoole
$ echo 'extension=swoole.so' >> /etc/php/7.3/mods-available/swoole.ini
$ ln -s /etc/php/7.3/mods-available/swoole.ini /etc/php/7.3/cli/conf.d/20-swoole.ini

大致步骤就是上面这样,我这里使用的是 PHP 7.3,可以使用 php -m 确认是否安装成功。

安装扩展包

接着就可以安装扩展包了。
$ composer require "hhxsv5/laravel-s:~3.4.0"

发布配置和二进制文件。

$ php artisan laravels publish

启动

接着我们就可以启动 Laravels 了。这时候注意一下监听地址,192.168.10.10 是 Homestead 虚拟机的地址,这里监听的实际上是这个地址,而默认监听的是 127.0.0.1,所以可以修改一下配置,直接修改 env 就行。

.env
LARAVELS_LISTEN_IP=192.168.10.10
接着就可以启动了,当然你可以增加一个 -d 参数,让它运行在后台。

$ php ./bin/laravels start

访问 http://192.168.10.10:5200

环境这样就基本上可以使用了,但是有个问题,因为是常驻内存,当我们修改代码的时候,并不会立即生效,必须重新启动进程。

修改代码后自动 Reload

扩展包提供了两种方法,用来热更新代码

Inotify 扩展
首先需要安装一个扩展。

$ sudo -s
$ pecl install inotify
$ echo 'extension=inotify.so' >> /etc/php/7.3/mods-available/inotify.ini
$ ln -s /etc/php/7.3/mods-available/inotify.ini /etc/php/7.3/cli/conf.d/20-inotify.ini
使用 php -m 确认一下扩展正确安装上了。

接着修改一下配置,参考 https://github.com/hhxsv5/laravel-s/blob/m... 关于 inotify 的配置

.env
LARAVELS_INOTIFY_RELOAD=true

inotiff

重新启动一下 ./bin/laravels start,就可以生效了。因为我们现在使用的是 Homestead 环境,所以 Homestead 外面修改文件并不会触发自动更新。

扩展包提示我们可以安装一个 Vagrant 的插件,不过这个插件也是几年没有更新了,我这里是 Mac 环境,安装后并没有触发更新。我没有研究出来该怎么弄,你可以尝试一下,这种方式。

Fswatch

另一种方式是使用 fswatch, 先来安装一下。

$ sudo apt-get install fswatch
$ ./bin/fswatch

这时候会有一个问题,fswatch 会不停的触发文件的更改,查看相关的 issue 找到了这个 PR https://github.com/hhxsv5/laravel-s/pull/9... ,对 fswatch 参数做一个修改之后,就完全正常了。

编辑bin/fswatch
fswatch -e ".*" -i "\\.php$" -m poll_monitor -r ${WORK_DIR} | while read file
如果你也出现了上面这个问题,可以像我一样手动修改一下。

尝试着对代码进行修改你会发现代码会立刻生效了,正常我们开发这么使用基本就没什么问题了。

配合 nginx

通常情况下我们项目上线还是会配合 Nginx 使用的,扩展包也给出了实例,修改一下。我这里创建了一个站点 package-homestead.test。

使用 vi 打开

$ sudo vim /etc/nginx/sites-enabled/package.test。
/etc/nginx/sites-enabled/package.test
#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 {
    # 通过 IP:Port 连接
    server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
    # 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能
    #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;
    keepalive 16;
}
server {
    listen 80;
    # 别忘了绑Host哟
    server_name pakcage.test;
    root /vagrant/home/Code/package/public;
    #access_log /yyypath/log/nginx/$server_name.access.log  main;
    autoindex off;
    index index.html index.htm;
    # Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。
    location / {
        try_files $uri @laravels;
    }
    # 当请求PHP文件时直接响应404,防止暴露public/*.php
    #location ~* \.php$ {
    #    return 404;
    #}
    location @laravels {
        # proxy_connect_timeout 60s;
        # proxy_send_timeout 60s;
        # proxy_read_timeout 120s;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        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;
    }
}

gzip 已经开启,所以注释掉即可。使用 sudo nginx -s reload 重启 nignx。

注意 nginx 使用的是 127.0.0.1:5200,所以修改项目的变量。

.env
#LARAVELS_LISTEN_IP=192.168.10.10
重启之后访问站点。

启动 WebSocket

$ mkdir app/Services
$ touch app/Services/WebSocketService.php
app/Services/WebSocketService.php
namespace App\Services;

use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
/**
 * @see https://wiki.swoole.com/wiki/page/400.html
 */
class WebSocketService implements WebSocketHandlerInterface
{
    // 声明没有参数的构造函数
    public function __construct()
    {
    }
    public function onOpen(Server $server, Request $request)
    {
        // 在触发onOpen事件之前Laravel的生命周期已经完结,所以Laravel的Request是可读的,Session是可读写的
        // \Log::info('New WebSocket connection', [$request->fd, request()->all(), session()->getId(), session('xxx'), session(['yyy' => time()])]);
        $server->push($request->fd, 'Welcome to LaravelS');
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
    }
    public function onMessage(Server $server, Frame $frame)
    {
        // \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]);
        $server->push($frame->fd, date('Y-m-d H:i:s'));
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
    }
    public function onClose(Server $server, $fd, $reactorId)
    {
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
    }
}

config/laravels.php

    'websocket'  => [
        'enable' => true,
        'handler' => \App\Services\WebSocketService::class,
    ],

/etc/nginx/sites-enabled/package.test


map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
location =/ws {
    # proxy_connect_timeout 60s;
    # proxy_send_timeout 60s;
    # proxy_read_timeout:如果60秒内被代理的服务器没有响应数据给Nginx,那么Nginx会关闭当前连接;同时,Swoole的心跳设置也会影响连接的关闭
    # proxy_read_timeout 60s;
    proxy_http_version 1.1;
    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_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_pass http://laravels;
}

重启 nginx sudo nginx -s reload

随便找个在线的 WebSocket 测试工具,例如 http://coolaf.com/tool/chattest

配合 Supervisor

生产环境通常都会通过 Supervisor 来启动 swoole,配置也很简单。

$ /etc/supervisor/conf.d
$ sudo touch package.conf
/etc/supervisor/conf.d/package.conf
[program:package.test]
command=/usr/bin/php /home/vagrant/Code/package/bin/laravels start -i
numprocs=1
autostart=true
autorestart=true
startretries=3
user=vagrant
redirect_stderr=true
stdout_logfile=/home/vagrant/Code/package/storage/logs/supervisord-stdout.log

重启 supervisor
sudo service supervisor restart

评论数量: 0

0
点赞
108
浏览
0
评论

贡献 76