php如何进行多进程与异步调用方法

浏览器和服务器之间只一种面向无链接的HTTP协议进行通信的,面向无链接的程序的特色是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久链接。php

这样就出现了一个问题,一个客户端的相应服务端可能执行1秒也有可能执行1分钟,这样浏览器就会一直处于等待状态,若是程序执行缓慢,用户可能就没耐心关掉了浏览器。linux

而有的时候咱们不须要关心程序执行的结果,没有必要这样浪费时间和耐心等待,那咱们就要想出办法让程序不收等待在后台静默执行。浏览器

根据我的的总结,总结了以下方法:服务器

1.客户端页面采用AJAX技术请求服务器swoole

   大多用于提高用户的体验而弄。网络

2 利用linux多进程与php函数相结合多线程

 利用php的popen函数打开进程文件指针,配合linux命令,打开的多进程趋于稳定。框架

$cmd = "cd /dir/代码目录;php index.php method >> ".$log_file." &";
// linux命令 ,建议把执行结果输出于日志

for($i = 1; $i <= $thisPlantaskConfig['thread']; $i++)  //用参数thread控制开启的进程数
{
     pclose(popen($cmd, "w"));  //打开进程
     usleep(mt_rand(100,500));  //间隔打开
} curl

这样子开启的多进程模式会存在某些缺陷,在后期的文章中会说起异步

3 远程请求的多进程

  curl的多线程操做,建立批处理句柄,发出多请求,不用等待上个请求是否成功

<?php
// 建立一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 建立批处理cURL句柄
$mh = curl_multi_init();

// 增长2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
// 执行批处理句柄
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 关闭所有句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?> 

4 使用某些扩展

 利用某些通讯扩展,例如php-process

   固然,我我的不建议使用这个。

5 利用开源项目

   善于利用前辈的经验,站在巨人的肩膀上。

  swoole 和 workerman 是我我的认为很是过优秀的异步,并行,高性能的网络通讯框架,值得学习

相关文章
相关标签/搜索