php非阻塞

PHP非阻塞模式

让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施:

一、若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑。

帮助


01

02

03

04

05

06

07

08

09

10

echo "program start.";

file_put_contents(‘log.txt‘,‘start-time:‘.date(‘Y-m-d H:i:s‘), FILE_APPEND);

fastcgi_finish_request();

sleep(1);

echo ‘debug...‘;

file_put_contents(‘log.txt‘, ‘start-proceed:‘.date(‘Y-m-d H:i:s‘), FILE_APPEND);

sleep(10);

file_put_contents(‘log.txt‘, ‘end-time:‘.date(‘Y-m-d H:i:s‘), FILE_APPEND);

这个例子输出结果可看到输出program start.后会话就返回了,所以debug那个输出浏览器是接收不到的,而log.txt文件能完整接收到三个完成时间。

二、使用fsockopen、cUrl的非阻塞模式请求另外的网址

帮助


1

2

3

4

5

6

7

8

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);

if (!$fp) die(‘error fsockopen‘);

stream_set_blocking($fp,0);

$http = "GET /save.php  / HTTP/1.1\r\n";   

$http .= "Host: www.example.com\r\n";   

$http .= "Connection: Close\r\n\r\n";

fwrite($fp,$http);

fclose($fp);

利用cURL中的curl_multi_*函数发送异步请求

帮助


1

2

3

4

5

6

$cmh = curl_multi_init();

$ch1 = curl_init();

curl_setopt($ch1, CURLOPT_URL, "http://localhost:6666/child.php");

curl_multi_add_handle($cmh, $ch1);

curl_multi_exec($cmh, $active);

echo "End\n";

三、使用Gearman、Swoole扩展
Gearman是一个具有php扩展的分布式异步处理框架,能处理大批量异步任务;
Swoole最近很火,有很多异步方法,使用简单。(尘缘注:号称重新定义PHP,把NodeJS喷得体无完肤。Swoole工具虽好,却感觉是扩展本身跟NodeJS没可比性)

四、使用redis等缓存、队列,将数据写入缓存,使用后台计划任务实现数据异步处理。
这个方法在常见的大流量架构中应该很常见吧

五、极端的情况下,可以调用系统命令,可以将数据传给后台任务执行,个人感觉不是很高效。

帮助


1

2

$cmd = ‘nohup php ./processd.php $someVar >/dev/null  &‘;

`$cmd`

六、外国佬的大招,没看懂,php原生支持
http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html

七、安装pcntl扩展,使用pcntl_fork生成子进程异步执行任务,个人觉得是最方便的,但也容易出现zombie process。

帮助


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

if (($pid = pcntl_fork()) == 0) {

    child_func();    //子进程函数,主进程运行

} else {

    father_func();   //主进程函数

}

echo "Process " . getmypid() . " get to the end.\n";

function father_func() {

    echo "Father pid is " . getmypid() . "\n";

}

function child_func() {

    sleep(6);

    echo "Child process exit pid is " . getmypid() . "\n";

    exit(0);

}

时间: 2024-10-06 21:39:21

php非阻塞的相关文章

Java NIO实现非阻塞式socket通信

博主知识水平有限,只能提供一个个人的狭隘的理解,如果有新人读到这儿,建议看一下其他教程或者API,如果不明白,再来看一下:如果有dalao读到这儿,希望能指出理解中的问题~谢谢 Java提供了用于网络通信的socket和serversocket包,然而实现方式是阻塞式的,同一时间点上只能进行一个连接,这会带来不好的体验.当然了,我们也可以通过不断创建线程的方式管理连接,但线程多了的话反而会降低效率.于是Java推出了非阻塞式IO--channel.并且channel提供关于网络通信的相关chan

Windows 非阻塞或异步 socket

异步与非阻塞区别见我的另外一篇文章Socket 同步/异步与阻塞/非阻塞区别 select WSAAsyncSelect WSAEventSelect 重叠(Overlapped)I/O IOCP:完成端口 Select 首先要使用ioctlsocket设置为非阻塞模式. 然后启动线程,线程中不停select. WSAAsyncSelect WSAAsyncSelect模型是Windows下最简单易用的一种Socket I/O模型.使用这种模型时,Windows会把网络事件以消息的形势通知应用程

理解同步异步与阻塞非阻塞

本篇文章我准本从三个大方面来解释下同步异步.阻塞非阻塞的知识,第一个方面主要是说下,到底什么是同步异步.阻塞非阻塞:第二个方面主要是解释下在I/O场景下,同步异步阻塞非阻塞又是怎么定义的,第三个方面介绍下在unix下同步异步又有哪些阻塞非阻塞IO. 1.同步异步与阻塞非阻塞 首先从大的方面来说,"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1).同步与异步 同步和异步关注的是消

Java多线程之~~~线程安全容器的非阻塞容器

在并发编程中,会经常遇到使用容器.但是如果一个容器不是线程安全的,那么他在多线程的插入或者删除的过程 中就会出现各种问题,就是不同步的问题.所以JDK提供了线程安全的容器,他能保证容器在多线程的情况下安全的插 入和删除.当然,线程安全的容器分为两种,第一种为非阻塞似的,非阻塞的意思是当请求一个容器为空或者这个请求 不能执行的时候,就会报出异常,第二种阻塞的意思是,不能执行的命令不会报出异常,他会等待直到他能执行.下面 我们实现一个例子,这个例子就是多个线程去大量的插入容器数据,而另一个线程去大量

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.

时间获取程序客户端 TCP 使用非阻塞connect

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie /** * TCP,使用非阻塞 connect **/ #include "unp.h" int connect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec) { int flags, n, error; socklen_t len; fd_set rset, wset; struct timeval t

非阻塞模式(ioctlsocket)

1 //Server.cpp 2 #include <stdio.h> 3 #include <winsock2.h> //winsock.h (2种套接字版本) 4 #pragma comment(lib,"ws2_32.lib") //wsock32.lib 5 6 #define MAXSIZE 100 // 7 8 int main() 9 { 10 // 11 int retVal; 12 13 char buf[MAXSIZE]; 14 15 //初

非阻塞IO服务器模型

我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss.每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线.如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先分析游戏服务器有哪些特点: ①  网络游戏并非像网页一样,打开一旦下载完就可以关闭连接结束.网游必须是有一个持久有状态的连接,每一个客户端都需要跟服务器存在一个持久的连接,以便快速及时发送消息.而随着并发用户数量的增加,多线程阻塞服务器不可能为每一个客户端分配一个线程. ②  跟一般的应用服务器不同

爬虫必备—性能相关(异步非阻塞)

在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. 1. 同步执行 1 import requests 2 3 def fetch_async(url): 4 response = requests.get(url) 5 return response 6 7 8 url_list = ['http://www.github.com', 'http://www.bing.com'] 9 10 for url in url_list:

理解阻塞非阻塞与同步异步

作者:严肃链接:https://www.zhihu.com/question/19732473/answer/20851256来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous c