基于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 相关文章推荐
基于Zend的Config机制的应用分析
May 02 PHP
深入php var_dump()函数的详解
Jun 05 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
Codeigniter整合Tank Auth权限类库详解
Jun 12 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 PHP
smarty实现多级分类的方法
Dec 05 PHP
php表单敏感字符过滤类
Dec 08 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
Aug 06 PHP
Memcached介绍及php-memcache扩展安装
Apr 01 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
PHP文件与目录操作示例
2016/12/24 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
百度地图api如何使用
2015/08/03 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python验证码识别的示例代码
2017/09/21 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
Django添加feeds功能的示例
2018/08/07 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
Python类的继承super相关原理解析
2020/10/22 Python
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
公司捐款倡议书
2014/05/14 职场文书
运动会入场词
2015/07/18 职场文书