基于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 db类库进行数据库操作
Mar 19 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
php实现socket推送技术的示例
Dec 20 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
PHP的PDO预定义常量讲解
Jan 24 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
goto语法在PHP中的使用教程
Sep 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
构建简单的Webmail系统
2006/10/09 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
TensorFlow变量管理详解
2018/03/10 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
python 多线程串行和并行的实例
2019/02/22 Python
python多进程重复加载的解决方式
2019/12/13 Python
Django models文件模型变更错误解决
2020/05/11 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
python3中编码获取网页的实例方法
2020/11/16 Python
python 发送get请求接口详解
2020/11/17 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
python re模块和正则表达式
2021/03/24 Python
医药专业应届毕业生求职信范文
2014/01/01 职场文书
酒店员工检讨书
2014/02/18 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
软件项目实施计划书
2014/05/02 职场文书
宣传工作经验材料
2014/06/02 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript