基于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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
PHP中,文件上传
Dec 06 PHP
PHP 日期加减的类,很不错
Oct 10 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
PHP循环函数使用介绍之PHP基础入门教程
Sep 21 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php使用curl出现Expect:100-continue解决方法
Mar 03 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 PHP
PHP使用Session实现上传进度功能详解
Aug 06 PHP
php修改word的实例方法
Nov 17 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
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php创建多级目录的方法
2015/03/24 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
canvas知识总结
2017/01/25 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
2019/11/12 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
Python判断文件和文件夹是否存在的方法
2015/05/21 Python
Python+Opencv识别两张相似图片
2020/03/23 Python
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
python+pyqt5编写md5生成器
2019/03/18 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
python如何将两个txt文件内容合并
2019/10/18 Python
PyQt5实现画布小程序
2020/05/30 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Python项目打包成二进制的方法
2020/12/30 Python
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
简单的离婚协议书范本
2014/11/16 职场文书
房屋租房协议书范本
2014/12/04 职场文书