基于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 相关文章推荐
CodeIgniter php mvc框架 中国网站
May 26 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
PHP的AES加密算法完整实例
Jul 20 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
php微信公众号开发之秒杀
Oct 20 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
Laravel 类和接口注入相关的代码
Oct 15 PHP
在Laravel中使用MongoDB的方法示例
Nov 11 PHP
PHP7创建销毁session的实例方法
Feb 03 PHP
php回调函数处理数组操作示例
Apr 13 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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
基于mysql的论坛(4)
2006/10/09 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
详解Python迭代和迭代器
2016/03/28 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
python调用API实现智能回复机器人
2018/04/10 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
电话客服工作职责
2014/07/27 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
同学会邀请函模板
2015/01/30 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
python 镜像环境搭建总结
2022/09/23 Python