情景:
公司目前在做一個郵件發送的功能,發郵件是用的第三方的,公司是考務公司,給考生髮郵件,考生有時候會很多,所以需要寫一個進程發送,現在寫的是判斷髮送郵件進程是否正在運行,如果是,就表示還有郵件發送,退出進程,貼代碼:
public function sendEmailsByCli(){
if (PHP_SAPI !== 'cli') {
echo 'only cli excute';exit;
}
//檢查當前是否已有進程在執行
exec("ps -Af|grep sendEmailsByCli",$output,$return);
$count = 0;
if($output){
foreach($output as $row){
if(strpos($row,'index.php') !== false){//包含index.php就可以認爲是當前程序的進程
$count++;
}
}
}
if($count>1){//說明已經有進程在跑,退出
echo "thread exist";exit;
}
//開始發送郵件
$limit = 20;
//......開始寫發送郵件功能
}
註釋:
PHP_SAPI 用來判斷是使用命令行還是瀏覽器執行的,如果 PHP_SAPI==’cli’ 表示是在命令行下執行
php判斷解析php服務是由那種服務器軟件,是採用那種協議 直接輸出即可
代碼如下:
<?php
echo PHP_SAPI;
?>
我的測試環境是nginx+fastcgi 輸出結果爲:
cgi-fcgi
如果是apache 運行環境,輸出結果爲
apache2handler
如果是命令行的形式執行,結果爲
cli
這就是PHP_SAPI
exec ( string $command
[, array &$output
[, int &$return_var
]] ) : string
exec — 執行一個外部程序
exec() 執行 command
參數所指定的命令。
command
要執行的命令。
output
如果提供了 output
參數, 那麼會用命令執行的輸出填充此數組, 每行輸出填充數組中的一個元素。 數組中的數據不包含行尾的空白字符,例如 \n 字符。 請注意,如果數組中已經包含了部分元素,exec() 函數會在數組末尾追加內容。如果你不想在數組末尾進行追加, 請在傳入 exec() 函數之前 對數組使用 unset() 函數進行重置。
return_var
如果同時提供 output
和 return_var
參數, 命令執行後的返回狀態會被寫入到此變量。