这里的“其他程序”,可能是linux命令,可能是其他的php文件。
网上说法有四种。分别为:
1、通过加载页面的时候通过ajax技术异步请求服务器
2、通过popen()函数
3、通过curl扩展
4、通过fscokopen()函数
说说我的看法!
通过ajax技术
不推荐
若需要异步执行的“程序”太过于耗时,而用户此时若关闭了浏览器的话,一般如果没有做什么特殊配置或者服务器端代码没有做特殊处理的话,服务器端的代码会终止执行。这就导致了这个“程序”执行并不完整,造成数据缺失,会对项目有影响。
当然,如果说在代码中加入ignore_user_abort(true)方法的话,是可以忽略浏览器是否关闭而将该脚本执行完。
通过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命令
案例:
$popen_cmd = '/usr/local/php/bin/php /home/zhixingjiaoben/erp_sync_stock.sh &';
pclose(popen($popen_cmd, 'r'));
通过curl扩展
验证可行
$ch = curl_init();
$curl_opt = array(
CURLOPT_URL=>'hostname/syncStock.php',
CURLOPT_RETURNTRANSFER=>1,
CURLOPT_TIMEOUT=>1,);
curl_setopt_array($ch, $curl_opt);
$out = curl_exec($ch);
curl_close($ch);
原理:通过curl去调用一个php脚本,如果响应时间超过了1秒钟,则断开该连接,程序继续往下走而syncStock.php这个脚本还在继续往下执行。
缺点:必须设置CURLOPT_TIMEOUT=>1这个属性,所以导致客户端必须至少等待1秒。但是这个属性不设置又不行,不设置的话,就会一直等待响应。就没有异步的效果了。
通过fscokopen()函数
待验证