PHP异步编程简述

PHP异步编程简述

概述 异步编程,我们从字面上理解,可以理解为代码非同步执行的。异步编程可以归结为四种模式:回调、事件监听、发布/订阅、promise模式。我们最熟悉的两种模式是回调和事件监听,举两个最简单的javascript例子,一个ajax,一个点击事件的绑定: $.getJSON(“uri”, params, function(result) { do_something_with_data(result); }); $(“#id”).click(function(){ do_something_when_user_click_id(); }); 以上两个示例有一个共同的特点,就是把函数当做参数传递给另一个函数。被传递的函数可以被称作为闭包,闭包的执行取决于父函数何时调用它。 优势与劣势 异步编程具有以下优势: 解耦,你可以通过事件绑定,将复杂的业务逻辑分拆为多个事件处理逻辑 并发,结合非阻塞的IO,可以在单个进程(或线程)内实现对IO的并发访问;例如请求多个URL,读写多个文件等 效率,在没有事件机制的场景中,我们往往需要使用轮询的方式判断一个事件是否产生 异步编程的劣势: 异步编程的劣势其实很明显——回调嵌套。相信一部分人在写ajax的时候遇到过这样的场景: $.getJSON(“uri”, params, function(result_1) { $.getJSON(“uri”, result_1, function(result_2) { $.getJSON(“uri”, result_2, function(result_3) { do_something_with_data(result_3); }); });; }); 这样的写法往往是因为数据的依赖问题,第二次ajax请求依赖于第一次请求的返回结果,第三次ajax依赖于第二次。这样就造成深层次的回调嵌套,代码的可读性急剧下降。虽然有一些框架能够通过一些模式解决这样的问题,然并卵,代码的可读性相比同步的写法依然差很多。 异步编程的另一个劣势就是编写和调试的过程更加复杂,有时候你不知道什么时候你的函数才会被调用,以及他们被调用的顺序。而我们更习惯同步串行的编程方式。 然而,我相信一旦你开始使用异步编程,你一定会喜欢上这种方式,因为他能够带给你更多的便利。 PHP异步编程概述 在php语言中,异步的使用并不像javascript中那么多,归其原因主要是php一般是在web环境下工作,接收请求->读取数据->生成页面,这看起来天生就是一个串行的过程;所以,在php中,异步并没有广泛使用。 在javascript中的4中异步编程模式,均可以在php中实现。 回调: array_walk($arr, function($key, $value){ $value += 1; }); print_r($arr); 回调的方式,在大多情况下,代码仍然是顺序执行的(array_walk->print_r的顺序)。回调函数的意义在于被传递者可以调用回调函数对数据进行处理,这样的好处在于提供更好的扩展性和解耦。我们可以把这个回调函数理解为一个格式化器,处理相同的数据,当我传递一个json过滤器时,返回的结果可能是一个json压缩过的字符串,当我传递的是一个xml过滤器时,返回的结果可能是一个xml字符串(有点多态的思想)。 事件监听(定时器,时间事件): $loop = React\EventLoop\Factory::create();
Continue reading PHP异步编程简述