今天想把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
输入后:
启动成功,用网页调试下:
服务端后台打印: