php 判斷進程是否正在執行

情景:
公司目前在做一個郵件發送的功能,發郵件是用的第三方的,公司是考務公司,給考生髮郵件,考生有時候會很多,所以需要寫一個進程發送,現在寫的是判斷髮送郵件進程是否正在運行,如果是,就表示還有郵件發送,退出進程,貼代碼:

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 參數, 命令執行後的返回狀態會被寫入到此變量。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章