PHP 异步使用swoole的可行性测试
PHP的异步、并行、高性能网络通信引擎swoole框架,在一开始我就比较注意,原因无他,php在swoole未出的情况下在多线程调度上确实算得上没有较好的解决方案。
我以系统的注册流程举例,在比较复杂的系统中,用户创建,需要同时做出很多相应的其他的操作,比如关联其他的业务表,发送邮件等操作是比较耗时的,但是其实又和登陆信息的注册毫无关系,一般情况我们会丢到队列服务中去。然后通过使用定时任务去处理用户创建后的其他异步操作。那既然前景和旧的解决方案已经提出来,那么使用swoole能做得更好吗?
这里我使用的是swoole的TCP服务器作为邮件异步服务器开启task来作为异步操作,然后web端调用swoole的TCP客户端发送后不等待recv接收直接关闭。下面贴出我的执行代码
TCP的服务器
<?php /**
* Created by PhpStorm.
* User: xujun
* Date: 2017/7/28
* Time: 22:26
*/
class TcpService
{
public function run(){
$serv = new swoole_server("127.0.0.1", 9502); //设置异步任务的工作进程数量
$serv->set(array('task_worker_num' => 4)); $serv->on('receive', function($serv, $fd, $from_id, $data) {
//投递异步任务
$task_id = $serv->task($data);
echo "异步任务id=$task_id\n";
}); //处理异步任务
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
echo "异步任务[id=$task_id]".PHP_EOL;
//返回任务执行的结果
//为了测试时间的延时性这里我做了大数组的特性
try{
//会内存超出
$arr = array_fill(0,100000,0);
foreach ($arr as $v){
//echo $v;
}
foreach ($arr as $v){
//echo $v;
}
$num = 0;
while(true){
if($num>2147483647){
break;
}
$num++;
}
}catch(Exception $e){
$e->getMessage();
} $serv->finish("[".date('Y-m-d H:i:s')."]{$data}邮箱已经发送");
}); //处理异步任务的结果
$serv->on('finish', function ($serv, $task_id, $data) {
echo "异步任务[$task_id] 完成: $data".PHP_EOL;
}); $serv->start();
}
} $a = new TcpService();
$a->run();
下面是web客户端的脚本
<?php
//处理管道
class Cross{
public function process(array $stages, $payload)
{
foreach ($stages as $stage) {
$payload = call_user_func($stage, $payload);
}
return $payload;
}
}
//管道
class Pipeline
{ private $stages = []; public function __construct(array $stages = [])
{
foreach ($stages as $stage) {
if (false === is_callable($stage)) {
throw new Exception('All stages should be callable.');
}
}
$this->stages = $stages;
$this->processor =new Cross;
}
/**
* @inheritdoc
*/
public function pipe(callable $stage)
{
$this->stages[] = $stage;
return $this;
}
/**
* Process the payload.
*
* @param $payload
*
* @return mixed
*/
public function process($payload)
{
return $this->processor->process($this->stages, $payload);
} } $pie = new Pipeline();
$pie->pipe(function($payload){
echo '系统用户'.$payload.'数据验证成功<br>';
return $payload;
})->pipe(function($payload){
echo '系统用户数据生成<br>';
return $payload;
})->pipe(function($payload){
echo '异步开始发送验证邮件<br>';
//创建swoole客户端
try{
$client = new swoole_client(SWOOLE_SOCK_TCP); //连接到服务器
if (!$client->connect('127.0.0.1', 9502, 0.5))
{
die("connect failed.");
}
//向服务器发送数据
if (! $client->send("系统发送给用户{$payload}一封验证邮件"))
{
die("send failed.");
} $client->close(); }catch (Exception $e){
echo $e->getMessage();
}
return $payload;
})->pipe(function($payload){
echo date('Y-m-d H:i:s').'系统成功创建用户<br>';
});
$pie->process('我是09');
测试顺序是,先开启tcp服务器,然后访问web脚本
执行结果
web脚本

TCP服务器的处理值

从结果上来说,验证邮件发送并没有阻塞到web脚本,也就是满足我们的异步要求。
PHP 异步使用swoole的可行性测试的更多相关文章
- 【swoole】如何在docker+swoole环境下测试udp服务
前面几篇文章讲了使用 docker+swoole 环境来测试tcp服务以及如何测试,但是当我开始学习udp服务那块的时候,发现使用原来的方式在 docker+swoole 环境下行不通啦,后来发现如果 ...
- tornado异步请求响应速度的实例测试
tornado异步请求响应速度的实例测试
- swoole简单demo测试
测试代码 1.server.php: <?php $serv = new swoole_server("0.0.0.0", 9502); $serv->on('conn ...
- PHP异步扩展Swoole笔记(2)
dispatch_mode, 数据包分发策略 可以选择7种类型,默认为21,轮循模式,收到会轮循分配给每一个Worker进程2,固定模式,根据连接的文件描述符分配Worker.这样可以保证同一个连接发 ...
- PHP异步扩展Swoole笔记(1)
安装Swoole扩展 通过pecl安装, 系统中最好已经有http2依赖, 如果是Ubuntu, 可以直接通过apt安装nghttp2, 如果是Centos或者需要自己编译, 在Github下载ngh ...
- TCP异步IO_服务端_测试
1.测试代码来自于 JDK7 AIO初体验 http://www.iteye.com/topic/1113611 1.1. package aio; import java.net.InetSocke ...
- [转]Business Model Canvas(商业模式画布):创业公司做头脑风暴和可行性测试的一大利器
本文转自:http://www.36kr.com/p/214438.html 本文来自First Round Review,他们准备的文章既讲故事,还同时向创业者提供可操作的建议,以助力打造优秀的公司 ...
- 在laravel5.8中集成swoole组件----初步测试
铺垫 前提是先安装swoole组件,我采用从pecl-----php扩展组件网下载swoole扩展包,然后切入到解压缩的扩展包中运行phpize命令, phpize是一种编译命令,可以在安装文件中生成 ...
- jquery.ajax异步发送请求的简单测试
使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...
随机推荐
- asp.net中的reportview报错跟预编有关系
当报表控件出现: 报表定义无效.详细信息:根级别上的数据无效.行1,位置1. 先检查一下,你的aspx文件是不是变成了这样一句话 这是预编译工具生成的标记文件,不应被删除! 如果这样的话,报表控件是不 ...
- 吴裕雄 python深度学习与实践(3)
import threading, time def doWaiting(): print('start waiting:', time.strftime('%S')) time.sleep(3) p ...
- 吴裕雄 07-MySQL数据类型
数值类型 TINYINT SMALLINT MEDIUMINT INT或INTEGER BIGINT FLOAT DOUBLE DECIMAL 日期和时间类型DATE TIME YEAR DATETI ...
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力。
ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力. 1.http://www.yangqq.com/jstt/css3/2017-08-08/787. ...
- 手工命令行 搭建 hadoop 和 spark 环境
环境准备:3台CentOS7,64位,Hadoop2.7需要64位Linux 192.168.20.161 192.168.20.162 192.168.20.163 三台机器分别叫host01. ...
- IDEA2017-破解方法
@方法一 第一步:下载jar 包 地址:https://github.com/locationbai/registerIDEA_2017.3.2_jar 第二部:将下载好的jar放在idea安装目录下 ...
- java集合: LinkedList源码浅析
LinkedList 数据结构是双向链表,插入删除比较方便.LinkedList 是线程不安全的,允许元素为null . 构造函数: 构造函数是空的. /** * Constructs an emp ...
- pta l2-7(家庭房产)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 题意:给定n个人的信息,包括其编号 ...
- 关于set_output_delay与set_input_delay概念与用法
一. 这两条约束语句都是针对板级延时而言的. 语句中必须的有是,时钟与port. 二. set_input_delay 用于数据输入端口,调节数据输入与时钟输入到来的相位关系. 当FPGA外部送 ...