基于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的分页功能
Mar 21 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
PHP 读取和编写 XML
Nov 19 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
php比较相似字符串的方法
Jun 05 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
实例简介PHP的一些高级面向对象编程的特性
Nov 27 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
Oct 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
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
PHP技术开发技巧分享
2010/03/23 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python中遍历文件的3个方法
2014/09/02 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
python批量修改图片大小的方法
2018/07/24 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Python过滤序列元素的方法
2020/07/31 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
python实现网页录音效果
2020/10/26 Python
毕业证丢失证明
2014/01/15 职场文书
工作迟到检讨书
2014/02/21 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
详解php中流行的rpc框架
2021/05/29 PHP
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android