今天想把websocket搭建起来,查了下原始的Laravel并没有这个功能,发现php中websocket用workerman好像比较多。
在此将他们结合下,但结合时发现了一些问题。此篇博文虽然以及结合起来了,但是在某些情况下,建议还是分开,做成微服务的那种。
如果是使用虚拟机或服务器。业务简单的情况下可以结合起来,不影响。还可以共享很多资源。
如果使用的虚拟空间。就必须要分开了。因为虚拟空间只开了80或443端口,websocket需要另外开个端口,所以这种情况要分开。
如果是要搞中大型的项目,建议分开。
下面来看下整合,先加载库
composer require workerman/workerman
创建控制台命令:
php artisan make:command Workerman
此时会在app/Console/Commands下面新建一个Workerman.php
将代码改成:
- <?php
-
- namespace App\Console\Commands;
-
- use Illuminate\Console\Command;
- use Workerman\Worker;
-
- class Workerman extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'workerman:websocket';
-
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = 'Command description';
-
- /**
- * Create a new command instance.
- *
- * @return void
- */
- public function __construct()
- {
- parent::__construct();
- }
-
- /**
- * Execute the console command.
- *
- * @return int
- */
- public function handle()
- {
- $wsWorker = new Worker('websocket://0.0.0.0:2346');
-
- $wsWorker->onConnect = function($connection){
-
- echo "New Connection\n";
- };
-
- $wsWorker->onMessage = function ($connection, $data){
-
- $connection->send('Hello' . $data);
- };
-
- $wsWorker->onClose = function ($connection){
-
- echo "Connection closed\n";
- };
-
- Worker::runAll();
- }
- }
这里有几点要注意:
这个$signature要填写,控制台启动workerman时就是
php artisan workerman:websocket
输入后:
启动成功,用网页调试下:
服务端后台打印: