laravel使用swoole
另外主要用到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的更多相关文章
- laravel 整合 swoole ,并简单 ab 测试对比性能以及在 PHPstorm 中利用debug调试配置swoole服务中的PHP代码
安装PHP 的 swoole 扩展 及 安装 laravel,就不描述了 整合 laravel 和 swoole 用了这个轮子,侵入性很小,一行代码搞定,推荐一下,今天刚用,不能预测未来是否会遇见坑 ...
- Laravel通过Swoole提升性能
1.安装配置laravel 1.1.composer下载laravel composer create-project --prefer-dist laravel/laravel blog " ...
- PHP laravel+thrift+swoole打造微服务框架
Laravel作为最受欢迎的php web框架一直广受广大互联网公司的喜爱. 笔者也参与过一些由laravel开发的项目.虽然laravel的性能广受诟病但是业界也有一些比较好的解决方案,比如堆机器, ...
- Laravel集成Swoole教程
1.准备工作 安装 Laravel laravel new laravel-swoole 本人使用 valet 进行开发,可以使用 laravel-swoole.test 进行访问 2 ...
- laravel配合swoole使用总结
最近对接硬件做了两个项目,用到了swoole 第一个是门禁系统,需要远程开门.离线报警.定时开门.离线刷卡等功能 1.远程开门: 目前用cli创建个临时客户端连接服务端发送命令,服务端处理完成后客户端 ...
- 基于Laravel+Swoole开发智能家居后端
基于Laravel+Swoole开发智能家居后端 在上一篇<Laravel如何优雅的使用Swoole>中我已经大概谈到了Laravel结合Swoole的用法. 今天,我参与的智能家居项目基 ...
- Laravel如何优雅的使用Swoole
背景 正在做一个智能家居的项目(钱低的吓死人怎么办),接收下位机(就是控制智能家居硬件模块的HUB)协议解析,Web端维护硬件状态,利用APP交互.由于下位机数据是发送到服务器的XXX端口,所以必须对 ...
- 使用 Swoole 来加速你的 Laravel 应用
Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...
- 使用 Swoole 来加速 Laravel应用
Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...
随机推荐
- Redis之Ubuntu开机启动
1.编译源码,生成可执行文件: 2.将生成的可执行文件拷贝到 /user/local/bin目录下,若没有x权限请加上: 3.将安装包中的 redis.conf配置文件移到/etc/redis.con ...
- sendevent是使用
按下: sendevent /dev/input/event4 1 254 1 sendevent /dev/input/event4 0 0 0 松开: sendevent /dev/input/e ...
- codeforces 466C. Number of Ways 解题报告
题目链接:http://codeforces.com/problemset/problem/466/C 题目意思:给出一个 n 个数的序列你,问通过将序列分成三段,使得每段的和都相等的分法有多少种. ...
- C语言文件读写总结
主要有四种: 1.文件的字符输入输出函数 fgetc fputc2.文件的字符串输入输出函数 fgets fputs3.文件的格式化输入输出函数 fscanf fprintf4.文件的数据块输入输出函 ...
- 【CQ18高一暑假前挑战赛4】标程
[二分或者STL] 二分: #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int main() { ,pos; s ...
- WinDbg 调试工具的使用
概述 项目接近尾声了,可是在运行时会有memory leak(内存泄露) bug.产品在运行一天后,内存增长致1.4G,而我们产品的初始内存才有70M,问题很严重,决定采用WinDbg工具来分析代码问 ...
- hadoop各组件安装(非专业人士,不定期更新)
压缩包下载http://www.cnblogs.com/bfmq/p/6027202.html 1.zookeepermkdir /usr/local/hadooptar zxf /root/zook ...
- C# 使用WebClient时,在多网卡时,指定IP发送Web请求
需要定义一个类,重写GetWebRequest,在方法内,指定IP地址 public class MyWebClient : WebClient { private IPAddress ipAddre ...
- 必须知道的八大种排序算法【java实现】
一.冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...
- PHPstorm相同变量标识
setting-> plugins-> Browse Repositories 输入BrowseWordAtCaret 搜索,安装,然后重启