参考 参考2

另外主要用到artisan

首先创建SwooleCommand.php

<?php

namespace App\Console\Commands;

use App\Http\Controllers\SwooleHandler;use App\Models\Logs;
use App\Traits\TcpServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\App;
use Symfony\Component\Console\Input\InputArgument; class SwooleCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'swoole {action=start}'; /**
* The console command description.
*
* @var string
*/
protected $description = 'this is command for swoole'; protected $serv;
/**
* Create a new command instance.
*
* @return void
*/ /**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->fire();
} public function fire(){
$action = $this->argument('action');
switch ($action){
case 'start':
$this->info("swoole observer started");
$this->start();
break;
case 'stop':
$this->info("stoped");
break;
case 'restart':
$this->info("restarted");
break;
default:
$this->error("unknown command");
} } private function start(){
Logs::truncate();//重启cli后清空数据库
$this->serv = new \Swoole\Server(env('SWOOLE_SERVICE_ADDRESS', '127.0.0.1'), env('SWOOLE_SERVICE_PORT', 9503), SWOOLE_PROCESS);
$this->serv->set([
'worker_num' => 1,
'heartbeat_check_interval' => 60, //心跳检测
'max_request' => 1000,
'log_file' => './log/swoole.log',
]);
$handler = new SwooleHandler();
$this->serv->on('connect', [$handler, 'onConnect']);
$this->serv->on('receive', [$handler, 'onReceive']);
$this->serv->on('workerStart', [$handler, 'onWorkerStart']);
$this->serv->on('close', [$handler, 'onClose']);
$this->serv->start();
} protected function getArguments()
{
return [[
'action', InputArgument::REQUIRED, 'start|stop|restart'
]];
}
}

SwooleHandler.php

<?php
/**
* Created by PhpStorm.
* User: liuning
* Date: 2018/4/9
* Time: 11:35
*/ namespace App\Http\Controllers;
use App\Models\Config;
use App\Models\Logs;use App\Modules\Meeting\Models\ReserveRecord;use App\Traits\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; class SwooleHandler extends BaseController
{public function onConnect($server, $fd){
echo "建立连接通道ID:$fd\n";
} public function onWorkerStart($server, $workerId){
echo "worker启动了\n";
//进程开启时绑定定时器,只有workderId为0才添加定时器,避免重复添加
if($workerId == 0){
echo "定时开启\n";
swoole_timer_tick(10000, [$this, 'onTimer'], ['server'=>$server]);
}
} public function onReceive($server, $fd, $fromId, $data){
//收到指令后处理操作
} public function onTimer($timerId, $params){
//循环定时任务
echo "执行开门定时任务开始\n";
} public function onClose($server, $fd){
Logs::delLog($fd);//关闭通道
//添加警报
echo "断开连接通道: {$fd}\n";
} public function onTask($server, $task_id, $from_id, $data){
echo "任务开始\n";
} public function onFinish($server, $task_id, $data){
echo "任务结束\n";
}
}

在Kernel.php中新增命令

protected $commands = [
SwooleCommand::class,
];

这样就能在网站根目录打开tcp服务了

/usr/local/php/bin/php artisan swoole start
或以下命令后台运行
nohup /usr/local/php/bin/php artisan swoole start > dev/null 2>&1 &

如果想做指定用户推送数据就得另辟蹊径了,我创建了临时客户端与服务端建立连接。

同理先创建客户端命令

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ClientCommand extends Command
{
/**
* The name and signature of the console command.
* command+mac
* @var string
*/
protected $signature = 'send {ccc}'; /**
* The console command description.
*
* @var string
*/
protected $description = 'send...'; /**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
} /**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$command = $this->argument('ccc');
$client = new \Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->on("connect", function($cli)use($command) {
$cli->send(fromateSendCode($command));
});
$client->on("receive", function($cli, $data){
//处理$data
//echo 输出
});
$client->on("error", function($cli){
echo "connect failed\n";
});
$client->on("close", function($cli){
//echo "connection close\n";
});
$client->connect(env('SWOOLE_CLIENT_ADDRESS', '127.0.0.1'), env('SWOOLE_SERVICE_PORT', 9503), 0.5);
} protected function getArguments()
{
return [[
'ccc', InputArgument::REQUIRED
]];
}
}

这样就能用命令与服务端建立链接了

/usr/local/php/bin/php artisan send 111

这样客户端会一直与服务器建立连接,直到服务端主动关闭连接。所以需要在处理完客户端请求后给客户端发送数据,客户端收到后主动与服务端断开连接。

也可以调用代码来建立连接

function doShell($command){
$proPath = env('PRO_PATH', '/mnt/hgfs/www/blog');
$phpPath = env('PHP_PATH', '/usr/local/php/bin/php');
return shell_exec('cd '.$proPath.'; '.$phpPath.' artisan send '.$command);
}

laravel使用swoole的更多相关文章

  1. laravel 整合 swoole ,并简单 ab 测试对比性能以及在 PHPstorm 中利用debug调试配置swoole服务中的PHP代码

    安装PHP 的 swoole 扩展 及 安装 laravel,就不描述了 整合 laravel 和 swoole 用了这个轮子,侵入性很小,一行代码搞定,推荐一下,今天刚用,不能预测未来是否会遇见坑 ...

  2. Laravel通过Swoole提升性能

    1.安装配置laravel 1.1.composer下载laravel composer create-project --prefer-dist laravel/laravel blog " ...

  3. PHP laravel+thrift+swoole打造微服务框架

    Laravel作为最受欢迎的php web框架一直广受广大互联网公司的喜爱. 笔者也参与过一些由laravel开发的项目.虽然laravel的性能广受诟病但是业界也有一些比较好的解决方案,比如堆机器, ...

  4. Laravel集成Swoole教程

    1.准备工作 安装 Laravel laravel new laravel-swoole     本人使用 valet 进行开发,可以使用 laravel-swoole.test     进行访问 2 ...

  5. laravel配合swoole使用总结

    最近对接硬件做了两个项目,用到了swoole 第一个是门禁系统,需要远程开门.离线报警.定时开门.离线刷卡等功能 1.远程开门: 目前用cli创建个临时客户端连接服务端发送命令,服务端处理完成后客户端 ...

  6. 基于Laravel+Swoole开发智能家居后端

    基于Laravel+Swoole开发智能家居后端 在上一篇<Laravel如何优雅的使用Swoole>中我已经大概谈到了Laravel结合Swoole的用法. 今天,我参与的智能家居项目基 ...

  7. Laravel如何优雅的使用Swoole

    背景 正在做一个智能家居的项目(钱低的吓死人怎么办),接收下位机(就是控制智能家居硬件模块的HUB)协议解析,Web端维护硬件状态,利用APP交互.由于下位机数据是发送到服务器的XXX端口,所以必须对 ...

  8. 使用 Swoole 来加速你的 Laravel 应用

    Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...

  9. 使用 Swoole 来加速 Laravel应用

    Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...

随机推荐

  1. 基于Appium、Python的自动化测试

    基于Appium.Python的自动化测试环境部署和实践   第一章 导言 1.1 编制目的 该文档为选用Appium作为移动设备原生(Native).混合(Hybrid).移动Web(Mobile ...

  2. Appium基础——one demo

    启动模拟器,启动appium   android avd启动模拟器管理 选择一个版本启动   安装appium-client 直接pip install appium-python-client安装 ...

  3. spring类扫描注入-----类扫描的注解解析器

    通过类扫描注入到容器中,这种方式,在实际开发中还是很常用的,可以看下自己的配置文件,就会发现,自己公司的项目,搞不好就是这么注入的. 起码,我发现我公司的项目就是这么干的. 下面来演示一下简单的例子: ...

  4. H3C-交换机密码恢复

    交换机密码恢复: 一. 拔掉电源再插上重新启动交换机,在超级终端中可以看到交换机启动画面,当出现提示按CTRL+B时,此时按住CTRL+B,我们会看到有9个选项: 1. download applic ...

  5. 使用libvirt技术监控虚拟机资源利用情况

    使用libvirt技术监控虚拟机资源利用情况 (一)计算资源与内存资源的监控 libvirt中提供virDomainGetInfo方法可以将一个domain的计算资源和内存资源的使用情况封装在一个结构 ...

  6. Windows下安装zip包解压版mysql

    Windows下安装zip包解压版mysql 虽然官方提供了非常好的安装文件,但是有的时候不想每次再重装系统之后都要安装一遍MySQL,需要使用zip包版本的MySQL.在安装时需如下三步: 1. 新 ...

  7. 创建cube 维度层次

    http://blog.programmingsolution.net/ssas-2008/period-dimension-time-dimension-creation-with-year-mon ...

  8. ViewerJS 一个在浏览器上查看 PDF 和电子表格的 JavaScript 库

    Viewer.js简介 http://viewerjs.org/ 下载Viewer.js压缩包,解压后将ViewerJS文件夹放在网站根目录下 在浏览器地址栏中输入网址http://172.16.8. ...

  9. 1.131.15 Sqoop导出数据Export使用

    一.export 1.export概述 export工具将一组文件从HDFS导入到RDBMS.目标表必须已经存在于数据库中.根据用户指定的分隔符读取输入文件并将其解析为一组记录, 只有map: [ro ...

  10. E20180519-hm

    distinct adj. 明显的,清楚的; 卓越的,不寻常的; 有区别的; 确切的;