一、同步与异步的区别:

  1、同步模式:后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的.

  2、异步模式:则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。 "异步模式"非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,就现在来说应该没有什么后台服务器还是同步操作了

举一个场景:在用户抢票的时候,并不希望用户排队去连接数据库进行查询、判断、插入,完成之后再返回用户结果。其实我们并不需要用户等那么久的时间,用户提交之后,直接告诉他已经抢票成功了就可以了,至于各种操作,交给后台去处理就好。当然,这种情况我们现在都用消息列表来处理,把每一个用户提交的请求存在一个消息列队中,告诉用户已经搞定了,用户愉快的关掉页面之后,实际上后台还在一个一个从消息列队中取出请求进行操作。我们这篇文章则是通过一种异类的手法,实现操作在后台运行,无需用户等待。

二、fsockopen异步

  对于php来说最大缺点就是无法实现多线程管理,其程序的执行都是从头到尾,按照逻辑一路执行下来,不可能出现分支,

  1、创建需要操作耗时方法

 //循环操作1w次数据库public function test(){$i=input('id')?input('id'):1;while ( $i<= 10000) {echo $i;echo '<br/>';$data = ['title' => $i.'-'.date('Y-m-d H:i:s'), 'num' => $i];Db::name('input')->insert($data);$i++;}echo '完成';}

  2、我们创建了一个基于fsockopen的函数,这个函数中利用fsockopen去访问url,但是在访问时,并不要求获取url显示的内容,而是仅仅发出访问请求,请求到达后马上关闭这个访问。这样做的好处就是无需再等待被访问的url是否返回了可靠的信息,节约了时间,这段代码的执行时间在0.1-0.2秒之间,对于普通访客而言,几乎察觉不到。因此,在使用时,仅需要调用这个函数和对应的url即可。不过,这里并没有提供数据传输的部分,如何传输数据,其实只需要在$header中增加post的内容即可。

  

  /*** @生生 2018/12/24 19:25:06* [asynchronous PHP异步执行任务]* @param  string $url       执行任务的url地址* @param  array  $post_data 需要post提交的数据POST* @param  array  $cookie    cookie数据用于登录等的设置(此处内部调用,无需鉴权)* @return boole*/
public function asynchronous($url,$post_data = array()){$url_array = parse_url($url);dump($url_array);//用fsockopen()尝试连接  $fp = fsockopen($url_array['host'], 80, $errno, $errstr, 30);if (!$fp) {echo "$errstr ($errno)<br />\n";} else {//建立成功后,向服务器写入数据  $getPath = isset($url_array['path']) ? $url_array['path'] : '/';$out = "GET /".$getPath."/ HTTP/1.1\r\n";$out .= "Host:".$url_array['host']."\r\n";$out .= "Connection: Close\r\n\r\n";fwrite($fp, $out);/*忽略执行结果while (!feof($fp)) {echo fgets($fp, 128);}*///关闭链接fclose($fp);}}

  3、创建调起方法

    //调用方法function yibu(){/***  异步方法*   参数:(string)要执行的方法url,(array)传入参数*/$this->asynchronous('http://119.23.33.37/index.php/admin/index/test',['1'=>'haha']);//直接返回结果echo '操作成功';}

  4、浏览器访问调起方法(直接返回操作结果,大量循环后台慢慢执行)

三、swoole异步操作

1、创建异步服务器

<?php
//include '../application/admin/controller/SwooleAsynchronous.php';
/*** @生生 2018.1.1* 创建异步服务器*/
$ser = new swoole_server('0.0.0.0',9506);
//设置进程数
$ser->set(array('task_worker_num'=>4));//当有数据进来的时候
$ser->on('receive',function($ser,$fd,$from_id,$data){//投递异步任务$task_id = $ser->task($data);echo "Dispath AsyncTask: id=$task_id\n";
});/*** @处理异步任务* 调用$serv->task()后,程序立即返回,继续向下执行代码*/
$ser->on('task',function($ser,$task_id,$from_id,$data){echo "这个是:$task_id".'-'.$data.PHP_EOL;//call_user_func('SwooleAsynchronous::huidiao', $value);//返回任务执行的结果$ser->finish("任务完成");
});/*** @处理异步任务的结果* finish操作是可选的,也可以不返回任何结果*/
$ser->on('finish', function ($ser,$task_id,$data) {sleep(5);echo "数据是:$data".PHP_EOL;
});//开启
$ser->start();

2、执行异步(执行方法前要引入swoole_client这个类)

public function index(){          //异步处理方法$url = url('index/swooletest/test','','','119.23.33.37');$params=[['id'=>1,'url'=>$url],];//接口数据$msg = json_encode($params);$client = new swoole_client(SWOOLE_SOCK_TCP);//连接到服务器if (!$client->connect('127.0.0.1', 9506, 0.5)){$this->write("链接失败");}//向服务器发送数据if (!$client->send($msg)){$this->write("发送失败");}//关闭连接$client->close();echo  '完成';//注册连接成功回调// $client->on("connect", function($cli) {//     $cli->send("hello world\n");// });//注册数据接收回调// $client->on("receive", function($cli,$data){//     echo "Received: ".$data."\n";// });//注册连接关闭回调// $client->on("close", function($cli,$data){//     echo "Received: ".$data."\n";// });      }

访问index方法,来向服务端发送异步任务,这里用send是把需要操作的url发送过去

以上就是简单的swoole异步

日常拖更中....

转载于:https://www.cnblogs.com/emmmmmm/p/10167678.html

PHP异步:fsockopen及swoole异步相关推荐

  1. php使用异步redis,PHP Swoole异步Redis客户端实现方法示例

    本文实例讲述了PHP Swoole异步Redis客户端实现方法.分享给大家供大家参考,具体如下: 使用版本:1.8.0及以上 使用条件: 1.开启async-redis php --ri swoole ...

  2. 初识php异步多线程扩展swoole

    Swoole是一种PHP高级Web开发框架,框架不是为了提升网站的性能,是为了提升网站的开发效率.最少的性能损耗,换取最大的开发效率.利用Swoole框架,开发一个复杂的Web功能,可以在很短的时间内 ...

  3. swoole 异步redis

    1.安装redis 忽视 2.安装hiredis库 https://wiki.swoole.com/wiki/page/p-redis.html a. wget https://github.com/ ...

  4. python异步编程视频_asyncio异步编程【含视频教程】

    Python Python开发 Python语言 asyncio异步编程[含视频教程] 不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3. ...

  5. 浅谈.Net异步编程的前世今生----异步函数篇(完结)

    前言 上一篇我们着重讲解了TPL任务并行库,可以看出TPL已经很符合现代API的特性:简洁易用.但它的不足之处在于,使用者难以理解程序的实际执行顺序. 为了解决这些问题,在C# 5.0中,引入了新的语 ...

  6. 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

    传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...

  7. 同步异步 阻塞 非阻塞 异步调用 线程队列 协程

    阻塞 非阻塞 阻塞:程序遇到了IO操作 导致代码无法继续执行 交出了COU执行权 非阻塞:没有IO操作 或者即使遇到IO操作 也不阻塞代码执行 阻塞 就绪 运行指的是应用程序所处的状态写程序时 尽量减 ...

  8. (87)FPGA面试题-同步FIFO与异步FIFO区别?异步FIFO代码设计

    1.1 FPGA面试题-同步FIFO与异步FIFO区别?异步FIFO代码设计 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-同步FIFO与异步FIFO区 ...

  9. springboot异步和切面_Spring异步编程 你的@Async就真的异步吗?异步历险奇遇记

    引言有点长 前端的宝宝会用ajax,用异步编程到快乐的不行~ 我们java也有异步,用起来比他们还快乐~ 我们biaji一个注(gǒupí)解(gāoyào),也是快乐风男... 且看下面的栗子: 注 ...

最新文章

  1. Cron表达式的详细用法
  2. Java的I/O笔记(3)
  3. OpenCV清除背景扣除background subtraction的实例(附完整代码)
  4. android应用崩溃的调试方法
  5. 【Java多线程】并发容器CopyOnWriteArrayList
  6. Java Spring 后端项目搭建
  7. bootstrap guide
  8. 2014递归求解单链表中的平均值(C++,附递归函数思路讲解)
  9. nginx + tomcat 架构中,页面跳转,URL不变,网页内容变
  10. 如何删除github上的文件
  11. zib机器人怎么_ZIB智伴机器人好不好 ZIB智伴机器人使用测评
  12. 无纸化办公中如何保护数据安全
  13. 新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
  14. 计算机组成原理:MIPS
  15. Zabbix学习笔记(七)---网络波动监控
  16. BZOJ1050 [HAOI2006]旅行comf (并查集)
  17. 家庭用药助手:丁香园推出面向大众家庭用户的药品信息服务工具
  18. 编程参考- 重名符号的链接问题
  19. android qq登录分析,[原创]对QQ手游授权登录的一点分析
  20. EasyExcel如何返回业务处理中的错误信息

热门文章

  1. 超全!全国【计算机考研调剂信息】集合
  2. 薅羊毛系列之蜘蛛网电影抢票分析
  3. 【Gorm】增删改查使用入门
  4. 前端面试题之CSS篇
  5. 大家应该知道的社保常识 看看吧会有用的
  6. 传奇服务器维护活力值怎么算,怎么办啊请问那个活力值是怎么搞的,我的活力 – 手机爱问...
  7. php closure用法,php Closure::bind的用法(转)
  8. 如何升级笔记本电脑的BIOS?
  9. php serializable,PHP自定义序列化接口Serializable用法分析讲解
  10. 玩转Atlas200DK(七)合设环境准备