簡體   English   中英

PHP進程ID和唯一

[英]PHP Process ID and unique

我想在后台運行php腳本並將其PID存儲在數據庫中。 這樣我就可以檢查特定腳本是否正在運行(稍后)。

我們可以使用getmypid來獲取當前的PID。

但是根據PHP手冊

進程ID不是唯一的,因此它們是弱熵源。 我們建議不要依賴於依賴於安全性的上下文中的pids。

......我不能依賴PID。

我的第二個想法是將進程創建時間存儲到數據庫中。

如何獲取當前腳本創建的時間? 以后如何與tasklist進行比較以檢查特定腳本是否正在運行?

我在共享主機,Windows / Linux環境中運行。

來自php.net/getmypid

幾乎沒有修改來禁用非cli訪問。

腳本可以使用/usr/bin/php script.php

另外使用nohup /usr/bin/php script.php > nohup.out &在后台啟動nohup進程。

#!/usr/bin/php 
<?php 

if ( PHP_SAPI !== 'cli' ) {
    die( "Cmd line access only!\n" );
}

define( 'LOCK_FILE', "/var/run/".basename( $argv[0], ".php" ).".lock" );  // can also use /tmp
if( isLocked() ) die( "Already running.\n" ); 

# The rest of your script goes here.... 
echo "Hello world!\n"; 
sleep(30); 

unlink( LOCK_FILE ); 
exit(0); 

function isLocked() 
{ 
    # If lock file exists, check if stale.  If exists and is not stale, return TRUE 
    # Else, create lock file and return FALSE. 

    if( file_exists( LOCK_FILE ) ) 
    { 
        # check if it's stale 
        $lockingPID = trim( file_get_contents( LOCK_FILE ) ); 

       # Get all active PIDs. 
        $pids = explode( "\n", trim( `ps -e | awk '{print $1}'` ) ); 

        # If PID is still active, return true 
        if( in_array( $lockingPID, $pids ) )  return true; 

        # Lock-file is stale, so kill it.  Then move on to re-creating it. 
        echo "Removing stale lock file.\n"; 
        unlink( LOCK_FILE ); 
    } 

    file_put_contents( LOCK_FILE, getmypid() . "\n" ); 
    return false; 

} 
?>

這一切都取決於您對目標機器的訪問級別。 您可以使用PHP CLI,存儲PID(它們在特定時間點是唯一的,因此您不會有2個運行相同PID的進程)並在ps -ax的輸出中grep它們以檢查它們是否正在運行。 如果不是 - 從數據庫中刪除它們,這樣你就不會遇到同樣的PID問題。

您可以嘗試將PID與另一個id一起使用,例如:

如果您有一個使用文件ID = 327的壓縮作業,請嘗試存儲{PID} 327,並檢查此特定作業是否仍在運行。

即使PID被重用,你也不會存儲id為327的PID,或者如果你用這個特殊的id 327重新啟動壓縮過程,可能會改變PID。

但是,為了避免使用此id 327獲取相同的PID,您必須先檢查數據庫,然后在組合ID的末尾添加一個計數器,如{PID} 327_1。

希望這可以幫到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM