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 ...
随机推荐
- 如何配置eclipse的安卓SDK下载目录
首先,打开eclipse,主界面如图 2 点击Windows下的preference 3 然后在出现的对话框中选择“android” 4 然后我们就能看到的主界面,在这里输入android sdk的目 ...
- 吴裕雄 python神经网络 水果图片识别(4)
# coding: utf-8 # In[1]:import osimport numpy as npfrom skimage import color, data, transform, io # ...
- hbase高可用集群部署(cdh)
一.概要 本文记录hbase高可用集群部署过程,在部署hbase之前需要事先部署好hadoop集群,因为hbase的数据需要存放在hdfs上,hadoop集群的部署后续会有一篇文章记录,本文假设had ...
- Winform 事件
事件参数:object sender - 事件主体EventArgs e - 事件数据函数体 - 我进行的操作 常用事件:点击事件click (1)Load事件:该事件在窗体加载到内存时发生,即在第一 ...
- find命令归总
-amin n (主要指是否被读取过)对文件的最近一次访问是在 n 分钟之前. 例如:find /opt/* -amin 1 -type f (找出1分钟之前的/opt下的所有文件) -atime ...
- 第六篇:Jmeter Ftp服务器的连接
如上图: 创建一个---线程组----点击配置元件---添加FTP请求缺省值: IP:为你的FTP服务的IP remote file:为你FTP服务上的一个文件: Localfile:为你本地的路经: ...
- JMeter学习(一)工具简单介绍(转载)
转载自 http://www.cnblogs.com/yangxia-test 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的 ...
- phpunit 生成三种日志文件的配置方法
#目录结构 windows bin目录下 ├── phpunit.phar ├── phpunit.cmd ├── phpunit.xml ├── build.xml ├── ArrTest.php ...
- java中替换${xx}
import java.util.regex.Matcher; import java.util.regex.Pattern; public class replace { public static ...
- 【mybatis基础】mybatis开发dao两种方法
mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目.mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.mybat ...