美文网首页
PHP非阻塞实现方法

PHP非阻塞实现方法

作者: 谁叫白马入梦船 | 来源:发表于2018-04-18 14:54 被阅读0次

转自https://www.awaimai.com/660.html

为让 PHP 在后端处理长时间任务时不阻塞,快速响应页面请求,可以有如下措施:

1 使用 fastcgi_finish_request()

如果 PHP 与 Web 服务器使用了PHP-FPM(FastCGI 进程管理器),那通过fastcgi_finish_request()函数能马上结束会话,而 PHP 线程可以继续在后台运行。

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);

2 使用 fsockopen()

使用fsockopen()打开一个网络连接或者一个Unix套接字连接,再用stream_set_blocking()非阻塞模式请求:

$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);

3 使用 cURL

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

$time = time(); // 创建一对cURL资源

$ch1 = curl_init();

$ch2 = curl_init();

$ch3 = curl_init();// 设置URL和相应的选项

curl_setopt($ch1, CURLOPT_URL, "http://test.xtgxiso.cn/sleep1.php");

curl_setopt($ch1, CURLOPT_HEADER, 0);

curl_setopt($ch2, CURLOPT_URL, "http://test.xtgxiso.cn/sleep2.php");

curl_setopt($ch2, CURLOPT_HEADER, 0);

curl_setopt($ch3, CURLOPT_URL, "http://test.xtgxiso.cn/sleep3.php");

curl_setopt($ch3, CURLOPT_HEADER, 0); // 创建批处理cURL句柄

$mh = curl_multi_init(); // 增加2个句柄

curl_multi_add_handle($mh,$ch1);

curl_multi_add_handle($mh,$ch2);

curl_multi_add_handle($mh,$ch3);

$running=null; // 执行批处理句柄

do { usleep(10000); curl_multi_exec($mh,$running); } while ($running > 0); // 关闭全部句柄

curl_multi_remove_handle($mh, $ch1);

curl_multi_remove_handle($mh, $ch2);

curl_multi_remove_handle($mh, $ch3);

curl_multi_close($mh);

echo "\n total time : ".(time()-$time)."\n";

5 使用缓存和队列

使用redis等缓存、队列,将数据写入缓存,使用后台计划任务实现数据异步处理。

6 调用系统命令

极端的情况下,可以调用系统命令,可以将数据传给后台任务执行

相关文章

  • PHP非阻塞实现方法

    转自https://www.awaimai.com/660.html 为让 PHP 在后端处理长时间任务时不阻塞,...

  • java阻塞队列 LinkedBlockingQueue

    1、常用方法 构造方法 父类AbstractQueue实现 非阻塞方法 阻塞方法 其它 2、入队出队操作 当队列添...

  • java阻塞队列 ArrayBlockingQueue

    1、常用方法 构造方法 父类AbstractQueue实现 非阻塞方法 阻塞方法 其它 2、安全性如何保证? 由R...

  • PHP多线程编程和非阻塞实现方法

    PHP多线程 线程概述 线程是操作系统能够进行调度的最小单位 一个多线程程序比单线程程序被操作系统调度的概率更大,...

  • 并发编程之并发队列

    常见的并发队列有2种:阻塞队列和非阻塞队列。阻塞队列使用锁实现,非阻塞队列使用CAS非阻塞算法实现。这2种队列都是...

  • 并发队列-无界非阻塞队列ConcurrentLinkedQueu

    一、 前言 常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一...

  • 线程安全的实现方法(2)---非阻塞同步

    上文说到了线程安全的互斥同步实现方法,这里说一下非阻塞同步。 非阻塞同步 互斥同步的主要问题是线程阻塞和唤醒所带来...

  • 多线程之非阻塞队列

    ConcurrentLinkedQueue 相对于阻塞队列加锁实现阻塞,非阻塞队列采用无锁CAS的方式来实现。

  • Java IO快速入门

    网络IO实现方式分为BIO(阻塞IO)、线程池伪异步IO、NIO(非阻塞IO)、AIO(异步非阻塞IO); 异步、...

  • Java IO

    Before IO 分为:同步、异步阻塞、非阻塞 同步和异步是目的,阻塞和非阻塞是实现方式。 一个IO操作其实分成...

网友评论

      本文标题:PHP非阻塞实现方法

      本文链接:https://www.haomeiwen.com/subject/hibvkftx.html