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 ...
 
随机推荐
- C# 基础  new 、override实现多台区别
			
一.new只是隐藏父类中的同名方法.基类和父类中都存在这个方法. namespace ConsoleApplication1 { class Program { static void Main(st ...
 - KJMusic完整音乐项目
			
KJMusic完整音乐项目 KJMusic是一个完整音乐项目,这个项目从欢迎页面到首页以及音乐播放页面都做得非常不错.并且本音乐支持本地音乐,和音乐电台,支持切换上下首个.本项目还支持侧滑出现menu ...
 - SQL数据库优化
			
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
 - ubuntu下安装nodejs和npm
			
第一种安装方法: 安装nodejs : 1 sudo apt-get install nodejs 运行 nodejs -v 会弹出安装node的版本号 这里使用的是 nodejs 并不是常用的nod ...
 - Manifest File
			
[Manifest File] on every build, webpack generates some webpack runtime code, which helps webpack do ...
 - unity中Android环境变量配置
			
http://www.cnblogs.com/windytrees/p/7533477.html
 - Ubuntu 16.04 LTS network DIASBLED解决办法
			
问题 昨天正浏览着网页,突然无法连接.但右上角的wifi信号显示仍然是连接状态.于是我尝试断开再重新连接一次,没想到刚断开就报了个内部错误,然后wifi图标直接消失了.重启后虽然有wifi图标,但无法 ...
 - 【C++】正则表达式引擎学习心得
			
最近参照一些资料实现了一个非常简易的正则表达式引擎,支持基本的正则语法 | + * ()等. 实现思路是最基本的:正则式->AST->NFA->DFA. 以下是具体步骤: 一. 正则 ...
 - Tomcat添加管理员role
			
最近朋友问我怎么在Tomcat里面使用 admin 登录,一般情况下登录后是提示xxx的,经过百度后,好不容易才找到答案: 原来添加一个role为admin:<role rolena ...
 - leetcode 栈和队列类型题
			
1,Valid Parentheses bool isVaild1(string& s) { // 直接列举,不易扩展 stack<char> stk; ; i < s.le ...