基于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控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
实用函数9
Nov 08 PHP
php 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
php自动识别文件编码并转换为UTF-8的方法
Jun 12 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
smarty内置函数section的用法
Jan 22 PHP
php在数据库抽象层简单使用PDO的方法
Nov 03 PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
laravel-admin的多级联动方法
Sep 30 PHP
Thinkphp 3.2框架使用Redis的方法详解
Oct 24 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
解析php入库和出库
2013/06/25 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
详解Python3 pickle模块用法
2019/09/16 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
python opencv肤色检测的实现示例
2020/12/21 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
物流管理专业应届生求职信
2013/11/21 职场文书
财务管理职业生涯规划范文
2013/12/27 职场文书
高中同学聚会邀请函
2014/01/11 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
css样式important规则的正确使用方式
2022/06/10 HTML / CSS