6

バックグラウンドで php スクリプトを実行し、その PID をデータベースに保存したいと考えています。特定のスクリプトが実行されているかどうかを(後で)確認できるようにします。

getmypid現在の PID を取得するために使用できます。

しかし、PHPマニュアルによると

プロセス ID は一意ではないため、弱いエントロピー ソースです。セキュリティに依存するコンテキストでは、pid に依存しないことをお勧めします。

...そして、PID に頼ることはできません。

私の 2 番目のアイデアは、プロセス作成時間をデータベースに保存することです。

現在のスクリプトの作成時間を取得するにはどうすればよいですか? 後でタスクリストと比較して、特定のスクリプトが実行されているかどうかを確認するにはどうすればよいですか?

私は共有ホスト、windows/linux 環境で実行しています。

4

3 に答える 3

4

php.net/getmypidから

cli 以外のアクセスを無効にするための変更はほとんどありません。

を使用してスクリプトを実行できます/usr/bin/php script.php

さらに、バックグラウンドでnohupプロセスnohup /usr/bin/php script.php > nohup.out &を起動するために使用します。

#!/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; 

} 
?>
于 2013-07-26T06:45:26.797 に答える
1

それはすべて、ターゲット マシンへのアクセス レベルによって異なります。PHP CLI を使用して、PID を保存し (それらは特定の時点に固有であるため、同じ PID を持つ 2 つのプロセスが実行されることはありません)、出力でそれらを grep して、ps -axそれらが実行されているかどうかを確認できます。そうでない場合は、データベースからそれらを削除して、同じ PID が発生しても問題が発生しないようにします。

于 2013-07-26T06:32:30.473 に答える