php异步执行其余程序

这里的“其余程序”,多是linux命令,多是其余的php文件。php

网上说法有四种。分别为:linux

一、经过加载页面的时候经过ajax技术异步请求服务器ajax

二、经过popen()函数浏览器

三、经过curl扩展服务器

四、经过fscokopen()函数curl

 

说说个人见解!异步

经过ajax技术

不推荐函数

若须要异步执行的“程序”太过于耗时,而用户此时若关闭了浏览器的话,通常若是没有作什么特殊配置或者服务器端代码没有作特殊处理的话,服务器端的代码会终止执行。这就致使了这个“程序”执行并不完整,形成数据缺失,会对项目有影响。url

固然,若是说在代码中加入ignore_user_abort(true)方法的话,是能够忽略浏览器是否关闭而将该脚本执行完。spa

经过popen()函数

亲测可用,且必须在php.ini中注释掉disable_functions,这样popen函数才能使用。

该函数打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。因此能够经过调用它,但忽略它的输出

resource popen ( string $command , string $mode )

$command:linux命令

$mode:模式。

返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)而且必须用 pclose() 来关闭。此指针能够用于fgets()fgetss() 和 fwrite()。 当模式为 'r',返回的文件指针等于命令的 STDOUT,当模式为 'w',返回的文件指针等于命令的 STDIN。

若是出错返回 FALSE

优势:避免了第一个方法的缺点,而且也很快。
缺点:这种方法不能经过HTTP协议请求另外的一个WebService,只能执行本地的脚本文件。而且只能单向打开,没法穿大量参数给被调用脚本。而且若是,访问量很高的时候,会产生大量的进程。若是使用到了外部资源,还要本身考虑竞争。

注:$command必须是linux命令

案例:

1 $popen_cmd = '/usr/local/php/bin/php /home/zhixingjiaoben/erp_sync_stock.sh &';
2 pclose(popen($popen_cmd, 'r'));

 

经过curl扩展

验证可行

1 $ch = curl_init();        
2 $curl_opt = array(
3     CURLOPT_URL=>'hostname/syncStock.php',
4     CURLOPT_RETURNTRANSFER=>1,
5     CURLOPT_TIMEOUT=>1,);        
6 curl_setopt_array($ch, $curl_opt);        
7 $out = curl_exec($ch);        
8 curl_close($ch);

原理:经过curl去调用一个php脚本,若是响应时间超过了1秒钟,则断开该链接,程序继续往下走而syncStock.php这个脚本还在继续往下执行。

缺点:必须设置CURLOPT_TIMEOUT=>1这个属性,因此致使客户端必须至少等待1秒。可是这个属性不设置又不行,不设置的话,就会一直等待响应。就没有异步的效果了。

经过fscokopen()函数

待验证

相关文章
相关标签/搜索