网友解答:
首先,超时和在后台运行是两码事PHP超时设置
php配置中默认有个超时设置,默认好像是30秒超时,如果确实是程序超时问题,你需要修改下设置,或者在你脚本中设下超时参数。1、php.ini中超时设置2、代码中设置超时
ini_set("max_execution_time",30);
set_time_limit(30);
比如我么举个小例子:
注意这两个设置只对运行程序的这个这个连接回话生效,设置为了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中,这样他可以定时执行,不用人为干扰,后台执行。这种方法网上介绍很多,不多做介绍。2、写一个前台脚本,一个后台脚本
弄两个脚本一个前台脚本,一个后台脚本前台脚本启动后台脚本,举个例子(这是gnu win32包里面的例子)
后台脚本(test-proc-bg.php):
sleep(5);
file_put_contents('test.txt', date('Y-m-d/H:i:s.u'));
我们前台用wget.ext
$proc_command = "wget.exe http://localhost/test-proc-bg.php -q -O - -b";
$proc = popen($proc_command, "r");
pclose($proc);
我们注意下wget的参数,说明如下:
-q 静默模式
-O - 输出到标准输出
-b 后台运行
前台也可以用screen启动后台
shell_exec('screen -dmS $name $cmd');
$cmd为执行的命令 -S $name表示回话的名称,之后可以用screen -r $name 进入那个screen执行窗口(确保你机器已经安装过screen,默认下linux都是会安装的)。php后台执行启动器
最后我们奉上一个后台执行的启动器(前台执行函数):
function LaunchBackgroundProcess($command){
if(PHP_OS=='WINNT' || PHP_OS=='WIN32' || PHP_OS=='Windows'){
// Windows下
$command = 'start "" '. $command;
} else {
// Linux/UNIX下
$command = $command .' /dev/null &';
}
$handle = popen($command, 'r');
if($handle!==false){
pclose($handle);
return true;
} else {
return false;
}
}