安装步骤如下(推荐把安装文件下载到 /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 异步队列简明教程的更多相关文章

  1. swoole 异步队列

    安装步骤如下(推荐把安装文件下载到 /usr/local/src 目录下): step 1: wget --no-check-certificate https://github.com/swoole ...

  2. Gevent简明教程

    Gevent简明教程  发表于 2015-11-28 |  分类于 技术| |  阅读次数 5159 前述 进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程.多线程.协程和异步. 多 ...

  3. ASP.NET AJAX简明教程

     当我们谈论Ajax时,首先想到的就是JavaScript下的Ajax,用来完成网页的交互,局部刷新工作,Microsoft的ASP.NET AJAX框架在Web的开发中承担着类似的角色,并简化了Ja ...

  4. 异步队列 Deferred

    异步队列 Deferred 背景: 移动web app开发,异步代码是时常的事,比如有常见的异步操作: Ajax(XMLHttpRequest) Image Tag,Script Tag,iframe ...

  5. SaltStack简明教程

    第1章 SaltStack简明教程 1.1 SaltStack简介 SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理,如使用salt-cloud配置AWS E ...

  6. 2017-2018-2 20179207 《网络攻防技术》python简明教程(1-10)

    Python3简明教程(一) 开始python之旅 使用交互模式的 Python3解释器 简单使用 vim 编写 Python3 脚本 执行 Python3 脚本 Python3 代码风格建议 Pyt ...

  7. Swoole异步投递task任务

    [使用场景] Swoole的task模块可以用来做一些异步的慢速任务.耗时场景.如webim中发广播,发送邮件等,把这些任务丢给task进程之后,worker进程可以继续处理新的数据请求,任务完成后会 ...

  8. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  9. 2013 duilib入门简明教程 -- 部分bug (11)

     一.WindowImplBase的bug     在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,     1.最大化按钮的样式 ...

随机推荐

  1. 用wamp实现前端和php的交互效果

    我们今天来用php来做一下前台与后台的交互效果,首先我们先打开这个软件. 看一下电脑右下角的小图标 当变成之后鼠标左键 打开这个之后点击第二个之后会打开一个网站 点击右面页面的数据库打开新建数据库,填 ...

  2. swift 下storyboard的页面跳转和传值

    ------------------1. 最简单的方法 拖拽, 这个就不用多解释了吧. 直接拖拽到另一个视图控制器, 选择 show, 就行了. 2. 利用 Segue 方法 (这里主要是 方法1 的 ...

  3. 透明 Transparent connections through HTTP proxies.

    透明语境: 5.7层模型中数据链路层:透明传输: 谈谈如何使用Netty开发实现高性能的RPC服务器 - Newland - 博客园 http://www.cnblogs.com/jietang/p/ ...

  4. 使用JavaMail发送邮件,465端口开启ssl加密传输

    package com.wangxin.test; import java.security.Security; import java.util.Date; import java.util.Pro ...

  5. 剑指Offer——字符流中第一个不重复的字符

    题目描述: 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读 ...

  6. shell 从文件中读取批量文件名并做命令行操作

    222文件内容: /home/zhangsuosheng/Desktop/9-30/9_30/1bak/1538291162.png /home/zhangsuosheng/Desktop/9-30/ ...

  7. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

  8. maven 整合 ssm 异常分析

    异常一:使用tomcat 7 启动没问题访问(JSP)页面就报错:org.apache.jasper.JasperException: Unable to compile class for JSP ...

  9. 001-linux scp文件拷贝

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  10. sublime2常用插件

    Package Control 1. 安装方法 • 下载地址:https://sublime.wbond.net/Package%20Control.sublime-package • 将下载下来的P ...