基于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 数学运算验证码实现代码
Oct 11 PHP
PHP用SAX解析XML的实现代码与问题分析
Aug 22 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
May 16 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
Sep 30 PHP
PHP 解决session死锁的方法
Jun 20 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
Smarty简单生成表单元素的方法示例
May 23 PHP
浅谈php中fopen不能创建中文文件名文件的问题
Feb 06 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
js分页代码分享
2014/04/28 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
python的中异常处理机制
2018/08/30 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
python脚本和网页有何区别
2020/07/02 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
Lucene推荐的分页方式是什么?
2015/12/07 面试题
群众路线教师自我剖析材料
2014/09/29 职场文书
社团招新宣传语
2015/07/13 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书