基于 Laravel + Swoole + Vue 搭建实时在线聊天室(一):环境准备篇

本文首发在 Laravel 学院:https://laravelacademy.org/post/19881.html,Laravel 学院致力于提供优质 Laravel 中文学习资源。

项目概述

今天开始,学院君将带领大家基于 Swoole 搞个「大项目」 —— 开发在线聊天室,当然还是在 Laravel 框架中,前端 UI 还是基于 Vue 组件实现,本项目主要涉及以下技术:

  • 基于 Laradock 本地开发环境进行演示和测试

  • 后端基于 Laravel 5.8 + LaravelS 扩展包引入对 Swoole 的支持

  • 基于 Swoole 提供的 WebSocket 服务器功能进行聊天通信

  • 结合 Swoole 的异步任务和协程机制提升系统响应速度和性能

  • 使用 Redis + MySQL 作为数据存储介质

  • 实现用户注册登录功能,登录后用户才可以进入聊天室

  • 支持文字 + 图片 + 表情 + 链接消息

  • 支持查看历史消息和离线消息

  • 支持与普通用户/机器人聊天

  • 前端基于 Vue.js 框架实现 UI,并且引入 Vuex、Vue-Router 实现前后端分离

  • 支持通过 Laravel Dusk 对项目进行自动化测试

最终实现的聊天室截图如下所示:

Laravel+Swoole 聊天室

注:本项目前端 UI 借鉴自 https://github.com/hua1995116/webchat 这个前端项目。

开发环境

整个项目的开发基于 Laradock,你可以参照这篇教程安装并初始化 Laradock:在 Mac/Windows 系统中使用 Laradock 搭建基于 Docker 的 Laravel 开发环境,当然你也可以选择其他集成开发环境,比如 HomesteadValetLaragon 等,不过本系列教程默认都是基于 Laradock,后续项目环境配置、工具安装、调试运行都是以 Laradock 为准,使用其他开发工具的请自行按照自己的环境进行调整。

完成 Laradock 的安装和环境初始化之后,需要在根目录下的 .env 文件中启用 NPM 相关配置:

WORKSPACE_INSTALL_NODE=true

WORKSPACE_NODE_VERSION=node

WORKSPACE_NPM_REGISTRY=http://registry.npm.taobao.org/

以及 Swoole 相关配置:

WORKSPACE_INSTALL_SWOOLE=true

...

PHP_FPM_INSTALL_SWOOLE=true

然后重新构建 workspace 镜像:

docker-compose up -d workspace

让上述修改生效,并且在 workspacephp-fpm 容器中安装 Swoole 扩展。如果你还没有启动 Nginx、Redis、MySQL 的话,现在运行如下命令启动它们(后续教程假设它们都处于启动状态):

docker-compose up -d nignx mysql redis

项目初始化

注:以下操作你可以在本地进行(需要本地安装过 PHP、Composer、Node.js 等软件),也可以进入 workspace 容器指定目录下操作。

接下来,我们来安装并初始化聊天室项目 webchat, 由于我们在 .env 配置 APP_CODE_PATH_HOST 指向了与 laradock 同级的 wwwroot,所以我们可以在本地的 wwwroot 目录下通过 Composer 来创建这个项目:

composer create-project laravel/laravel webchat --prefer-dist -vvv

创建成功后,进入该项目目录,通过 Composer 安装 LaravelS 扩展包 ,以便快速在 Laravel 项目中使用 Swoole 提供的 API 进行编程,然后将该扩展包的配置文件和脚本文件发布到项目根目录下:

cd webchat

composer require hhxsv5/laravel-s

php artisan laravels publish

然后我们运行 php bin/laravels start 启动 Swoole,验证 Swoole 环境是否就绪:

LaravelS

看到如上信息即表示 Swoole 运行环境是正常的。

接下来,由于我们后续有可能用到 Redis,所以先安装对应的扩展包:

composer require predis/predis

后端的环境配置先告一段落,我们接下来来到前端,运行 npm install 初始化前端依赖,初始化完成后执行如下命令安装 Vuex 和 Vue-Router:

npm install vuex vue-router --save-dev

这样,我们就完成了聊天室项目的所有初始化工作,如果后续开发过程中需要其他依赖我们在具体教程中再安装。

自动化测试

我们还可以为项目编写浏览器测试代码实现自动化测试,这可以通过 Laravel 框架提供的 Dusk 扩展包来实现,我们可以通过 Composer 来安装这个扩展包:

composer require --dev laravel/dusk

由于我们只需要在开发环境进行测试,所以加上了 --dev 选项。之后运行 php artisan dusk:installtests 目录下初始化浏览器测试相关示例文件,该命令还会下载适配当前平台的 ChromeDriver 文件到扩展包的 bin 目录,这个时候可能会遇到网络问题导致下载失败:

image

不过由于 Dusk 扩展包已经自带了各个平台的 ChromeDriver 文件,所以可以忽略这个错误:

image

接下来,我们为项目设置虚拟域名 webchat.test,并且在 Laradock 根目录下的 nginx/sites 子目录中新增对应的虚拟主机配置 webchat.conf

server {



    listen 80;

    listen [::]:80;



    server_name webchat.test;

    root /var/www/webchat/public;

    index index.php index.html index.htm;



    location / {

        try_files $uri $uri/ /index.php$is_args$args;

    }



    location ~ \.php$ {

        try_files $uri /index.php =404;

        fastcgi_pass php-upstream;

        fastcgi_index index.php;

        fastcgi_buffers 16 16k;

        fastcgi_buffer_size 32k;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        #fixes timeouts

        fastcgi_read_timeout 600;

        include fastcgi_params;

    }



    location ~ /\.ht {

        deny all;

    }



    location /.well-known/acme-challenge/ {

        root /var/www/letsencrypt/;

        log_not_found off;

    }



    error_log /var/log/nginx/webchat_error.log;

    access_log /var/log/nginx/webchat_access.log;

}

然后在本地主机 /etc/hosts 中映射这个域名:

webchat.test 127.0.0.1

最后在 Laradock 根目录下重启 Nginx:

docker-compose up -d nginx

此时,我们已经可以通过 http://webchat.test 访问聊天室项目了。

回到 webchat 项目,在 .env 中修改 APP_URL 为我们配置的域名:

APP_URL=http://webchat.test

然后运行 php artisan dusk,测试通过,则表示我们的 Dusk 测试环境也是 OK 的:

Laravel Dusk

至此,我们已经完成聊天室项目开发环境、项目初始化和测试环境的准备工作,接下来就可以进行项目开发了。

本文首发在 Laravel 学院:https://laravelacademy.org/post/19881.html,Laravel 学院致力于提供优质 Laravel 中文学习资源。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容