PHP异步处理的实现方案

PHP异步处理的实现方案

有时候执行PHP时,一个文件有多个操作,如果等操作完了之后,很容易就超时了。这时我们就可以考虑异步处理,多个操作划分成两个PHP文件操作,第一个PHP文件可以先处理一些简单的,第二个文件在异步处理耗时的程序。举个例子,比如我们操作成功后需要记录日志,这个时候我们就可以操作成功就返回,然后异步处理记录日志。下面带大家看一下PHP四种常用的异步处理解决方案。

1、使用前端Ajax处理

$.post(“save”, params, function(json){},‘json’);

2、使用popen,执行本地文件

// $handle = popen(“php C:/wamp64/www/test/index.php &”, “r”);
// 1)可以是相对路径,也可以是绝对路径;
// 2)但是必须得加&符号,这个代表是程序在后台运行,不然,就达不到异步的效果
$handle = popen(“php ../../test/index.php &”, “r”);
$read = fread($handle, 2096);
echo $read;
pclose($handle);

3、使用curl

设置curl的超时时间 CURLOPT_TIMEOUT 为1 (最小为1),因此客户端需要等待1秒,curl请求地址必须为绝对路径

/**
 * 首页方法
 */
public function index(){
    $param = array(
        ‘name’=>‘wangdb’,
        ‘job’=>‘PHP params’
    );
    // 使用curl方法,将参数传递到add方法里面
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,“http://user.tp5.com/index/index/add”);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); //将数组转换为URL请求字符串
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_exec($ch);
    curl_close($ch);
}
/**
 * 添加方法
 */
public function add(){
    $params = input();
    $str = serialize($params);
   
    // 获取参数,将参数写到log日志里面,用来确认收到数据
    $filename = ‘C:\\wamp64\\log.txt’;
    $bat_log_filename = ‘C:\\wamp64\\log.txt’;
    $bat_file = fopen($filename, “w”);
    if($bat_file) {
        fwrite($bat_file, “echo “.$str.” >> “.$bat_log_filename.“\n”);
        fclose($bat_file);
    }
}

最终,日志输出结果为:

 echo a:2:{s:4:"name";s:6:"wangdb";s:3:"job";s:10:"PHP params";} >> C:\wamp64\log.txt

4、使用fsockopen,需要自己拼接header部分,输出结果与方法3一致(add内的方法一样,所以,输出结果也一样)

function doRequest($url, $param=array(),$timeout =10){
    $urlParmas = parse_url($url);
    $host = $urlParmas[‘host’];
    $path = $urlParmas[‘path’];
    $port = isset($urlParmas[‘port’])? $urlParmas[‘port’] :80;
    $errno = 0;
    $errstr = ;
    $fp = fsockopen($host, $port, $errno, $errstr, $timeout);
    $query = isset($param)? http_build_query($param) : ;
    $out = “POST “.$path.” HTTP/1.1\r\n”;
    $out .= “host:”.$host.“\r\n”;
    $out .= “content-length:”.strlen($query).“\r\n”;
    $out .= “content-type:application/x-www-form-urlencoded\r\n”;
    $out .= “connection:close\r\n\r\n”;
    $out .= $query;
    fputs($fp, $out);
    fclose($fp);
}
$param = array(
    ‘name’=>‘wangdb’,
    ‘job’=>‘PHP params’
);
$url = ‘http://user.tp5.com/index/index/add’;
doRequest($url, $param);

备注:

1、第一种方法在前端和服务器之间数据的异步处理方面会经常使用,ajax传值,非常方便;

2、第三种方法是单独在服务端使用的时候,也会经常性的用到,curl模拟请求,至于其他两种方法,对我来说,很少用到!

来源:http://www.phpchina.com/portal.php?mod=view&aid=40629

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据