php调用+shell超时,php执行shell时,如何异步调用使得不会超时?

首先php设置内存,超时和在后台运行是两码事

PHP超时设置

php配置中默认有个超时设置,默认好像是30秒超时,如果确实是程序超时问题,你需要修改下设置,或者在你脚本中设下超时参数php设置内存。

1、php.ini中超时设置

2dd19a8b470ecca423c1e7c790af08b6.png

2、代码中设置超时

0db4d228402ca3d484f8df93749dea5e.png

ini_set("max_execution_time",30);

set_time_limit(30);

比如我么举个小例子:

945a8cca27d5176f8ae5f8acd4a1c88d.png

508b8895102ff69b6dc229818d5d7a65.png

注意这两个设置只对运行程序的这个这个连接回话生效,设置为了0是用不超时间。php.ini 如果设置safe_mode模式,脚本中的设置不成立。

效果一样,但是具体内容需要参考php-fpm部分内容,如果php-fpm中设置了request_terminate_timeout的话,那么max_execution_time就不生效。

PHP程序后台运行一般如果运行量很大,需要大量时间执行的程序,需要调用第三方程序或者作为网路客户端的程序,不建议直接用php跑,可以用shell、perl、python等脚本替代。

程序调用时候,建议用如下方式:

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));

这个会执行$cmd变量报错的命令,并把输出结果(包括错误信息)都重定向到$outputfile指定的输出文件。执行的进程号输入到$pidfile指定的文件。这样执行的好处是你可以随时得到你程序执行的输出,根据pid文件中的进程号你也可随时通过ps命令查看执行进程是否还在运行,执行的情况如何。

但是这样也有个问题,虽然你的执行进程是后台执行的,但是你php如果是你手动在shell下执行的话,你退出shell或者直接关闭了shell窗口你php主程序也会完蛋,会导致你其他php部分运行完全中断。所以我们介绍其他方法保持你php脚本在后台执行的:

1、cron进程任务

把你的php脚本加入到cron中,这样他可以定时执行,不用人为干扰,后台执行php设置内存。这种方法网上介绍很多,不多做介绍。

2、写一个前台脚本php设置内存,一个后台脚本

弄两个脚本一个前台脚本php设置内存,一个后台脚本前台脚本启动后台脚本,举个例子(这是gnu win32包里面的例子)

$proc_command = "wget.exe http://localhost/test-proc-bg.php -q -O - -b";

$proc = popen($proc_command, "r");

pclose($proc);

我们注意下wget的参数php设置内存,说明如下:

-q 静默模式

-b 后台运行

前台也可以用screen启动后台

shell_exec('screen -dmS $name $cmd');

$cmd为执行的命令 -S $name表示回话的名称,之后可以用screen -r $name 进入那个screen执行窗口(确保你机器已经安装过screen,默认下linux都是会安装的)php设置内存。

php后台执行启动器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值