基于PHP异步执行的常用方式详解


Posted in PHP onJune 03, 2013

1.客户端页面采用AJAX技术请求服务器
优点:
最简单,也最快,就是在返回给客户端的HTML代码中,嵌入AJAX调用,或者,嵌入一个img标签,src指向要执行的耗时脚本。
缺点:一般来说Ajax都应该在onLoad以后触发,也就是说,用户点开页面后,就关闭,那就不会触发我们的后台脚本了。
而使用img标签的话,这种方式不能称为严格意义上的异步执行。用户浏览器会长时间等待php脚本的执行完成,也就是用户浏览器的状态栏一直显示还在load。
当然,还可以使用其他的类似原理的方法,比如script标签等等。
2.popen()函数
该函数打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
所以可以通过调用它,但忽略它的输出。使用代码如下:

pclose(popen("/home/xinchen/backend.php &", 'r'));

优点:避免了第一个方法的缺点,并且也很快。
缺点:这种方法不能通过HTTP协议请求另外的一个WebService,只能执行本地的脚本文件。并且只能单向打开,无法穿大量参数给被调用脚本。并且如果,访问量很高的时候,会产生大量的进程。如果使用到了外部资源,还要自己考虑竞争。
3.CURL扩展
CURL是一个强大的HTTP命令行工具,可以模拟POST/GET等HTTP请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。代码如下:
$ch = curl_init();
$curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php',
                            CURLOPT_RETURNTRANSFER, 1,
                            CURLOPT_TIMEOUT, 1,);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);

缺点:如你问题中描述的一样,由于使用CURL需要设置CUROPT_TIMEOUT为1(最小为1,郁闷)。也就是说,客户端至少必须等待1秒钟。
4.fscokopen()函数
fsockopen支持socket编程,可以使用fsockopen实现邮件发送等socket程序等等,使用fcockopen需要自己手动拼接出header部分
使用示例如下:
$fp = fsockopen("www.34ways.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /index.php  / HTTP/1.1\r\n";
    $out .= "Host: www.34ways.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    /*忽略执行结果
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }*/
    fclose($fp);
}

所以总结来说,fscokopen()函数应该可以满足您的要求。可以尝试一下。
PHP 相关文章推荐
功能齐全的PHP发送邮件类代码附详细说明
Jul 10 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
php tp验证表单与自动填充函数代码
Feb 22 PHP
基于PHP5魔术常量与魔术方法的详解
Jun 13 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 #PHP
深入PHP异步执行的详解
Jun 03 #PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 #PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 #PHP
PHP Error与Logging函数的深入理解
Jun 03 #PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 #PHP
基于Discuz security.inc.php代码的深入分析
Jun 03 #PHP
You might like
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
js获取域名的方法
2015/01/27 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
2014年体育部工作总结
2014/11/13 职场文书
2015年暑假工作总结
2015/07/13 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers