swoole 异步队列
安装步骤如下(推荐把安装文件下载到 /usr/local/src 目录下):
step 1: wget --no-check-certificate https://github.com/swoole/swoole-src/archive/v1.9.13.tar.gz
step 2: tar zxf v1.9.13.tar.gz
step 3: cd swoole-src-1.9.13
step 4: phpize
step 5: ./configure --with-php-config=/usr/local/php/bin/php-config
step 6: make && make install
step 7: 修改 php.ini ,加入 extension=swoole.so ,然后重启 php-fpm
step 8: 执行 php --info | grep swoole 查看设置是否生效 ############################ 消费者,文件名《server.php》 ############################
<?php
class Server {
private $serv;
private $logFile; public function __construct() {
$this->serv = new swoole_server('0.0.0.0', 9501); // 允许所有IP访问
$this->serv->set([
'worker_num' => 4, // 一般设置为服务器CPU数的1-4倍
'task_worker_num' => 1, // task进程的数量(一般任务都是同步阻塞的,可以设置为多进程单线程)
'daemonize' => true, // 以守护进程执行
'package_eof' => PHP_EOL, // 设置EOF
'open_eof_split' => true, // 按照EOF进行分包,防止TCP粘包
'max_request' => 5000, // 设置worker进程的最大任务数,软重启,防止可能存在的内存溢出
'task_max_request' => 5000, // 设置Task线程的最大任务数,软重启,防止可能存在的内存溢出
// 'task_ipc_mode' => 1, // 使用unix socket通信,默认模式
// 'log_file' => '/data/log/queue.log' , // swoole日志 // 数据包分发策略(dispatch_mode=1/3时,底层会屏蔽onConnect/onClose事件,
// 原因是这2种模式下无法保证onConnect/onClose/onReceive的顺序,非请求响应式的服务器程序,请不要使用模式1或3)
// 'dispatch_mode' => 2, // 固定模式,根据连接的文件描述符分配worker。这样可以保证同一个连接发来的数据只会被同一个worker处理
]); $this->logFile = dirname(__FILE__).'/log.txt'; // 以守护进程执行的时候,要绝对路径
$this->serv->on('Receive', [$this, 'onReceive']);
$this->serv->on('Task', [$this, 'onTask']);
$this->serv->on('Finish', [$this, 'onFinish']);
$this->serv->start();
} /**
* 接收到数据时回调此函数,发生在worker进程中
* $server,swoole_server对象
* $fd,TCP客户端连接的文件描述符
* $from_id,TCP连接所在的Reactor线程ID
* $data,收到的数据内容,可能是文本或者二进制内容
*/
public function onReceive($serv, $fd, $from_id, $data ) {
$str = "=========== onReceive ============ \n";
$str .= "Get Message From Client $fd:$data \n";
error_log($str, 3, $this->logFile);
$serv->task( $data );
} /**
* 在task_worker进程内被调用。worker进程可以使用swoole_server_task函数向task_worker进程投递新的任务。当前的Task进程在调用onTask回调函数时会将进程状态切换为忙碌,
* 这时将不再接收新的Task,当onTask函数返回时会将进程状态切换为空闲然后继续接收新的Task。
* $task_id是任务ID,由swoole扩展内自动生成,用于区分不同的任务。$task_id和$src_worker_id组合起来才是全局唯一的,不同的worker进程投递的任务ID可能会有相同
* $src_worker_id来自于哪个worker进程
* $data 是任务的内容
*/
public function onTask($serv, $task_id, $src_worker_id, $data) {
$data = trim($data); // 删除EOF
$array = json_decode( $data , true );
$str = "=========== onTask ============ \n";
$str .= var_export($array, 1);
error_log($str, 3 , $this->logFile);
return $array;
} /**
* 当worker进程投递的任务在task_worker中完成时,task进程会通过swoole_server->finish()方法将任务处理的结果发送给worker进程
* $task_id是任务的ID
* $data是任务处理的结果内容(也就是onTask()函数,中return的值)
*/
public function onFinish($serv, $task_id, $data) {
$str = "=========== onFinish ============ \n";
$str .= "Task $task_id finish ! \n";
$str .= var_export($data, 1);
error_log($str, 3, $this->logFile);
} }
$server = new Server(); ############################ 生产者,文件名《client.php》 ############################
<?php
class Client { private function _sendData($data) {
// dispatch_mode=2, 固定模式,根据连接的文件描述符分配worker
// 每次都要重新new ,不可做成单例(这样才有不同的连接文件描述符,进而有不同的task_id)
$client = new \swoole_client(SWOOLE_SOCK_TCP);
$client->connect('127.0.0.1', 9501, 1);
// 发送数据包,一定要在最后指明断行(防止“粘包”),一般值 PHP_EOL ,与配置参数package_eof的值保持一致
$client->send($data.PHP_EOL);
} public function run() {
for($i=0; $i<10; $i++) {
$data = [ 'time' => rand(1000, 9999),
'id' => $i ];
$jsonData = json_encode($data);
$this->_sendData($jsonData);
}
}
} ############################ 华丽的分割线 ############################ 先执行 php server.php (执行一次,会以守护进程运行)
然后再执行 php client.php # 内核参数调整(关键步骤)
http://wiki.swoole.com/wiki/page/p-server/sysctl.html # swoole 离线手册,里面有更多的示例
https://github.com/smalleyes/swoole-chm
swoole 异步队列的更多相关文章
- swoole 异步队列简明教程
安装步骤如下(推荐把安装文件下载到 /usr/local/src 目录下): step 1: wget --no-check-certificate https://github.com/swoole ...
- Swoole异步投递task任务
[使用场景] Swoole的task模块可以用来做一些异步的慢速任务.耗时场景.如webim中发广播,发送邮件等,把这些任务丢给task进程之后,worker进程可以继续处理新的数据请求,任务完成后会 ...
- .Net中的并行编程-4.实现高性能异步队列
上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队 ...
- jquery ajax 对异步队列defer与XMLHttprequest.onload的依赖
ajax 对异步队列defer与XMLHttprequest.onload的依赖
- 异步队列 Deferred
异步队列 Deferred 背景: 移动web app开发,异步代码是时常的事,比如有常见的异步操作: Ajax(XMLHttpRequest) Image Tag,Script Tag,iframe ...
- [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列
这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包 ...
- .Net中的并行编程-7.基于BlockingCollection实现高性能异步队列
三年前写过基于ConcurrentQueue的异步队列,今天在整理代码的时候发现当时另外一种实现方式-使用BlockingCollection实现,这种方式目前依然在实际项目中使用.关于Blockin ...
- 基于异步队列的生产者消费者C#并发设计
继上文<<基于阻塞队列的生产者消费者C#并发设计>>的并发队列版本的并发设计,原文code是基于<<.Net中的并行编程-4.实现高性能异步队列>>修改 ...
- js异步队列之理解
起因 最近看到一篇关于js异步执行顺序的解答,觉得有所收获,遂记录下来. marcotask和microtask js中异步队列可以分为两类,marcotask队列和microtask队列, marc ...
随机推荐
- Swift学习(四)常量&变量&基础数据类型
常量和变量 常量: 使用let关键词来声明一个常量 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的 编程时使用常量能够让代码看起来更加安全和简洁! let ...
- ORA-01810: 格式代码出现两次
今天在修改SQL语句的时候遇到这个小问题,提示的还是比较明显的,当然解决之道我是从百度上摘取的! 错误语句段:AND V.UPLOAD_DATE <=TO_DATE ('2013-11-11 2 ...
- 洛谷P1530 分数化小数 Fractions to Decimals
P1530 分数化小数 Fractions to Decimals 103通过 348提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目 ...
- Android基础总结(3)——UI界面布局
Android的UI设计有好几种界面程序编写方式.大体上可分为两大类:一类是利用可视化工具来进行,允许你进行拖拽控件来进行布局:还有一类是编写xml文档来进行布局.这两种方法可以相互转换. 1.常见的 ...
- [SSH 2] 以网站主页面浅谈Struts2配置
导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点 ...
- Date获取时间段
/** * */ package com.chinabase.common.util; /** * @author yuanji * @created on:Sep 19, 2008 */ impor ...
- js对象的相关操作方法
//在js的对象中可以直接将一个方法赋值给一个属性,这种方法非常好用. //在js中虽然没有像其他语言中的class关键字,但是我们也可以用函数,字面量的方式来模拟. var myHome={ nam ...
- 网站性能优化(Yahoo 35条)
Yahoo 网站性能优化 35条 一.内容部分 尽量减少 HTTP请求 减少 DNS查找 避免跳转 缓存 Ajxa 推迟加载 提前加载 减少 DOM元素数量 用域名划分页面内容 使 frame数量最少 ...
- 【MySQL】查询使用临时表
MySQL查询产生临时表的分析 官网说明的地址:http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html 参考:htt ...
- meta 标签属性(网站兼容与优化需要)
概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务. —— W3School ...