基于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 相关文章推荐
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
深入解析PHP中逗号与点号的区别
Aug 05 PHP
测试php函数的方法
Nov 13 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 PHP
php自定义hash函数实例
May 05 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
PHP在线书签系统分享
Jan 04 PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
AJax面试题
2014/11/25 面试题
高中生自我鉴定范文
2013/10/30 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
中标通知书格式
2015/04/17 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
运动会新闻报道稿
2015/07/22 职场文书
公司管理建议书
2015/09/14 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫