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的可行性测试的更多相关文章

  1. 【swoole】如何在docker+swoole环境下测试udp服务

    前面几篇文章讲了使用 docker+swoole 环境来测试tcp服务以及如何测试,但是当我开始学习udp服务那块的时候,发现使用原来的方式在 docker+swoole 环境下行不通啦,后来发现如果 ...

  2. tornado异步请求响应速度的实例测试

    tornado异步请求响应速度的实例测试

  3. swoole简单demo测试

    测试代码 1.server.php: <?php $serv = new swoole_server("0.0.0.0", 9502); $serv->on('conn ...

  4. PHP异步扩展Swoole笔记(2)

    dispatch_mode, 数据包分发策略 可以选择7种类型,默认为21,轮循模式,收到会轮循分配给每一个Worker进程2,固定模式,根据连接的文件描述符分配Worker.这样可以保证同一个连接发 ...

  5. PHP异步扩展Swoole笔记(1)

    安装Swoole扩展 通过pecl安装, 系统中最好已经有http2依赖, 如果是Ubuntu, 可以直接通过apt安装nghttp2, 如果是Centos或者需要自己编译, 在Github下载ngh ...

  6. TCP异步IO_服务端_测试

    1.测试代码来自于 JDK7 AIO初体验 http://www.iteye.com/topic/1113611 1.1. package aio; import java.net.InetSocke ...

  7. [转]Business Model Canvas(商业模式画布):创业公司做头脑风暴和可行性测试的一大利器

    本文转自:http://www.36kr.com/p/214438.html 本文来自First Round Review,他们准备的文章既讲故事,还同时向创业者提供可操作的建议,以助力打造优秀的公司 ...

  8. 在laravel5.8中集成swoole组件----初步测试

    铺垫 前提是先安装swoole组件,我采用从pecl-----php扩展组件网下载swoole扩展包,然后切入到解压缩的扩展包中运行phpize命令, phpize是一种编译命令,可以在安装文件中生成 ...

  9. jquery.ajax异步发送请求的简单测试

    使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...

随机推荐

  1. windows安装xgboost

    https://blog.csdn.net/leo_xu06/article/details/52300869 参考部分共同安装的部分: https://www.cnblogs.com/kongcon ...

  2. vue -- 九宫格抽奖

    html: <div class="line_item" :class="index == 1 ? 'active' : 'white_item'"> ...

  3. java-学习3(jdk-环境配置)

    学习java先安装jdk环境配置 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  4. hive 的理解

    什么是Hive 转自: https://blog.csdn.net/qingqing7/article/details/79102691 1.Hive简介 Hive 是建立在 Hadoop 上的数据仓 ...

  5. Linux命令_2

    P42 远程管理 命令 目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01.关机/重启 命令: shutdown  选项  时 ...

  6. jQuery写省级联动列表,创造二维数组,以及如何存/调用二维数组中的数据

    jQuery写省级联动列表,创造二维数组来存放数据,然后通过each来遍历调用,通过creatTxtNode创建文本节点,通过createElement创建标签option,在通过append将文本写 ...

  7. Cacti ERROR: opening '*.rrd': No such file or directory 解决方法

    error: opening /home/cacti/rra/url-2 no such file or directory 在看Cacti Graph Debug Mode发现如下报错 RRDToo ...

  8. javascript学习笔记(六):对象、内置对象

    创建对象 对象属性赋值的方式 <!DOCTYPE html> <html> <head lang="en"> <meta chaset=& ...

  9. 使用Jmeter(三十)针对ActiveMQ JMS POINT TO POINT压力测试(转载)

    转载自 http://www.cnblogs.com/yangxia-test 准备工作 针对JMS类型的Sampler,需要额外的jar包(这里用的是apache ActiveMQ,将下载的AMQ  ...

  10. Appium1.6 GUI界面介绍

    Appium1.6安装详见随笔:http://www.cnblogs.com/meitian/p/7360017.html   下面具体介绍一下GUI界面 1.appium server配置页面 2. ...