php异步执行其他程序

Posted good good study, day day up !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php异步执行其他程序相关的知识,希望对你有一定的参考价值。

这里的“其他程序”,可能是linux命令,可能是其他的php文件。

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

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

2、通过popen()函数

3、通过curl扩展

4、通过fscokopen()函数

 

说说我的看法!

通过ajax技术

不推荐

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

当然,如果说在代码中加入ignore_user_abort(true)方法的话,是可以忽略浏览器是否关闭而将该脚本执行完。

通过popen()函数

待验证

我验证过了该方法,怎么弄都不行。在php.ini中已经开启了popen方法,且需要执行的php脚本也是设置权限为777了,但是不知道为什么就是执行不成功

通过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()函数

待验证

 

以上是关于php异步执行其他程序的主要内容,如果未能解决你的问题,请参考以下文章

PHP中实现异步调用多线程程序代码

swoole与php协程实现异步非阻塞IO开发

我应该在 Fragment 中的啥生命周期状态下执行异步任务?

PHP异步执行后台的脚本命令

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

php实现异步调用