异步

PHP异步非阻塞的实现方法

前言

由于PHP本身是一种单进程的语言,每次请求在apache都是一个进程,在Nginx和fastCGI里面每个请求时一个单独的worker线程,而且在各个服务器里面的请求都是阻塞的,所以有些大批量的复杂逻辑或文本处理会导致请求响应时间很长,这里我们就要考虑让PHP实现异步非阻塞的做法,已达到减少响应时间的目的

一、各种实现方法

1、FastCGI的非阻塞方法:fastcgi_finish_request()
在PHP5.3.3版本之后,不管是Nginx还是Apache服务器,只要运行在FastCGI模式下,均可使用该方法,官方解释的作用是冲刷(flush)所有响应的数据给客户端。
boolean fastcgi_finish_request ( void )
此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行。
用法:可以在读写大文件、循环更新数据库等不影响结果的操作之前,执行该函数,把结果返回给客户端,php会继续执行下面的逻辑而不影响客户端的响应时间。

2、fsockopen()+stream_set_blocking()方法:
fsockopen()方法可以打开一个网络连接或Unxi套接字连接,stream_set_blocking()方法可以为资源流设置非阻塞或者阻塞模式,
使用fsockopen()打开一个网络连接或者一个Unix套接字连接,再用stream_set_blocking()设置资源成非阻塞模式请求,则该资源请求会是非阻塞的:
bool stream_set_blocking ( resource $stream , int $mode )
注:$mode=0则是非阻塞的,1则是阻塞的模式。
用法:

3、使用cURL执行异步请求:
cURL除了我们通常使用的curl_init来初始化和发送post和get请求之外,还可以使用curl_multi_init()方法来实现异步请求,其原理是使用系统的select这个多路I/O复用机制来异步发送请求
通常的用法:

异步用法:

4、使用Gearman/Swoole等PHP异步扩展或框架

5、使用缓存和队列

异步PHP

这里有一个新的程序包,它称为spatie/async,旨在在PHP中进行异步并行处理。

对于许多Web开发人员而言,PHP中的并行处理似乎是一个边缘案例,但让我们看一下Spatie上的一些用例:

我们想创建一个易于使用的程序包,但是它可以解决我们的用例。上面列出的有些示例将不使用新spatie/async软件包,因为Laravel还提供了一个队列系统。

这就是我们程序包中的异步代码的样子。

use Spatie\Async\Process;

$pool = Pool::create();

foreach (range(1, 5) as $i) {
    $pool[] = async(function () use ($i) {
        
    

Linux五种IO模型性能分析

socket阻塞与非阻塞,同步与异步

 

1. 概念理解

     在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
同步:
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事…

深入理解非阻塞同步IO和非阻塞异步IO

这两篇文章分析了Linux下的5种IO模型

http://blog.csdn.net/historyasamirror/article/details/5778378

http://blog.csdn.net/hguisu/article/details/7453390

很多人对阻塞 / 非阻塞, 同步 / 异步 的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异步IO。其实区别很大,编程模型完全不同。…

        

IO中同步、异步与阻塞、非阻塞的区别

一、同步与异步
同步/异步, 它们是消息的通知机制

1. 概念解释
A. 同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。
但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。
最常见的例子就是 SendMessage。
该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。
当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。…

向Facebook学习,通过协程实现Mysql查询的异步化

前言

最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能。由于facebook实现的比较早,他们不得不对php进行hack才得以实现。现在的php5.5,已经无需hack就可以实现了。
对于一个web网站的性能来说,瓶颈多半是来自于数据库。一般数据库查询会在某个请求的整体耗时中占很大比例。如果能提高数据库查询的效率,网站的整体响应时间会有很大的下降。如果能实现mysql查询的异步化,就可以实现多条sql语句同时执行。这样就可以大大缩短mysql查询的耗时。…