国产成人毛片视频|星空传媒久草视频|欧美激情草久视频|久久久久女女|久操超碰在线播放|亚洲强奸一区二区|五月天丁香社区在线|色婷婷成人丁香网|午夜欧美6666|纯肉无码91视频

php執(zhí)行shell時(shí),如何異步調(diào)用使得不會(huì)超時(shí)?

網(wǎng)友解答: 首先,超時(shí)和在后臺(tái)運(yùn)行是兩碼事PHP超時(shí)設(shè)置php配置中默認(rèn)有個(gè)超時(shí)設(shè)置,默認(rèn)好像是30秒超時(shí),如果確實(shí)是程序超時(shí)問(wèn)題,你需要修改下設(shè)置,或者在你腳本中設(shè)下超時(shí)參數(shù)。1、ph

網(wǎng)友解答:

首先,超時(shí)和在后臺(tái)運(yùn)行是兩碼事

PHP超時(shí)設(shè)置

php配置中默認(rèn)有個(gè)超時(shí)設(shè)置,默認(rèn)好像是30秒超時(shí),如果確實(shí)是程序超時(shí)問(wèn)題,你需要修改下設(shè)置,或者在你腳本中設(shè)下超時(shí)參數(shù)。

1、php.ini中超時(shí)設(shè)置2、代碼中設(shè)置超時(shí)

ini_set("max_execution_time",30);

set_time_limit(30);

比如我么舉個(gè)小例子:

注意這兩個(gè)設(shè)置只對(duì)運(yùn)行程序的這個(gè)這個(gè)連接回話生效,設(shè)置為了0是用不超時(shí)間。php.ini 如果設(shè)置safe_mode模式,腳本中的設(shè)置不成立。

效果一樣,但是具體內(nèi)容需要參考php-fpm部分內(nèi)容,如果php-fpm中設(shè)置了request_terminate_timeout的話,那么max_execution_time就不生效。

PHP程序后臺(tái)運(yùn)行

一般如果運(yùn)行量很大,需要大量時(shí)間執(zhí)行的程序,需要調(diào)用第三方程序或者作為網(wǎng)路客戶端的程序,不建議直接用php跑,可以用shell、perl、python等腳本替代。

程序調(diào)用時(shí)候,建議用如下方式:

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

這個(gè)會(huì)執(zhí)行$cmd變量報(bào)錯(cuò)的命令,并把輸出結(jié)果(包括錯(cuò)誤信息)都重定向到$outputfile指定的輸出文件。執(zhí)行的進(jìn)程號(hào)輸入到$pidfile指定的文件。這樣執(zhí)行的好處是你可以隨時(shí)得到你程序執(zhí)行的輸出,根據(jù)pid文件中的進(jìn)程號(hào)你也可隨時(shí)通過(guò)ps命令查看執(zhí)行進(jìn)程是否還在運(yùn)行,執(zhí)行的情況如何。

但是這樣也有個(gè)問(wèn)題,雖然你的執(zhí)行進(jìn)程是后臺(tái)執(zhí)行的,但是你php如果是你手動(dòng)在shell下執(zhí)行的話,你退出shell或者直接關(guān)閉了shell窗口你php主程序也會(huì)完蛋,會(huì)導(dǎo)致你其他php部分運(yùn)行完全中斷。所以我們介紹其他方法保持你php腳本在后臺(tái)執(zhí)行的:

1、cron進(jìn)程任務(wù)

把你的php腳本加入到cron中,這樣他可以定時(shí)執(zhí)行,不用人為干擾,后臺(tái)執(zhí)行。這種方法網(wǎng)上介紹很多,不多做介紹。

2、寫一個(gè)前臺(tái)腳本,一個(gè)后臺(tái)腳本

弄兩個(gè)腳本一個(gè)前臺(tái)腳本,一個(gè)后臺(tái)腳本前臺(tái)腳本啟動(dòng)后臺(tái)腳本,舉個(gè)例子(這是gnu win32包里面的例子)

后臺(tái)腳本(test-proc-bg.php):

sleep(5);

file_put_contents('test.txt', date('Y-m-d/H:i:s.u'));

我們前臺(tái)用wget.ext

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

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

pclose($proc);

我們注意下wget的參數(shù),說(shuō)明如下:

-q 靜默模式

-O - 輸出到標(biāo)準(zhǔn)輸出

-b 后臺(tái)運(yùn)行

前臺(tái)也可以用screen啟動(dòng)后臺(tái)

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

$cmd為執(zhí)行的命令 -S $name表示回話的名稱,之后可以用screen -r $name 進(jìn)入那個(gè)screen執(zhí)行窗口(確保你機(jī)器已經(jīng)安裝過(guò)screen,默認(rèn)下linux都是會(huì)安裝的)。

php后臺(tái)執(zhí)行啟動(dòng)器

最后我們奉上一個(gè)后臺(tái)執(zhí)行的啟動(dòng)器(前臺(tái)執(zhí)行函數(shù)):

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;

}

}

標(biāo)簽: