基于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 相关文章推荐
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
PHP开发中的错误收集,不定期更新。
Feb 03 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
使用PHP实现微信摇一摇周边红包
Jan 04 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
php和vue配合使用技巧和方法
May 09 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
php事务处理实例详解
2014/07/11 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
pyside写ui界面入门示例
2014/01/22 Python
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python IDLE入门简介
2017/12/08 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python监控进程脚本
2018/04/12 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
我为自己代言广告词
2014/03/18 职场文书
竞聘书格式及范文
2014/03/31 职场文书
初三开学计划书
2014/04/27 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
模范教师材料大全
2014/12/16 职场文书
通报表扬范文
2015/01/17 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL
Docker官方工具docker-registry案例演示
2022/04/13 Servers