PHP实现异步的三种方式
首先说明:PHP本身不支持异步,需要使用一些特殊技巧变相实现异步的效果!
三种实现方式
通用的异步执行文件 exec.php
1 2 3 |
|
popen
通过 popen() 函数打开进程文件指针,从而能异步执行脚本文件。(只在linux下有效)
1 2 |
|
缺点:只能异步执行本地的脚本文件,不能跨域执行,不能传递参数。
每次执行都会创建新的进程,当并发量高时就创建大量进程,从而造成资源浪费。
curl(推荐)--可以把需要异步执行的操作单独写一个方法或文件通过curl来调用,通过设置超时时间来达到异步的效果
应用程序以 curl 发起 http 请求的形式实现异步。但是 curl 请求也需要等待请求返回,程序同样会阻塞,这时我们需要设置 http 请求的超时时间为1s,这样相当于发起了一个 http 请求去执行任务,但是不等待其返回结果,继续向下执行程序,这样就可以实现异步效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
curl 请求实现异步方式的缺陷就是 http 请求的最小超时时间为1s。也就是应用程序无论如何都要等待1s钟以上才能响应(现在 curl 扩展也能支持毫秒级别的超时时间设置,不过毫秒时间的超时很容易造成请求失败)。
fsockopen
fsockopen() 函数用于打开一个网络连接或者一个Unix套接字连接。通过发起 http 通信来实现异步。
从原理上来说与 curl 请求一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
fsockopen 方式相比 curl 更复杂,需要自己拼接处 http 请求的 header 部分。在 curl 不支持毫秒级超时之前 fsockopen 方式无疑是最佳选择。