PHP进程ID和唯一性


PHP Process ID and unique

我想在后台运行一个php脚本,并将其PID存储在数据库中。这样我就可以检查特定的脚本是否在运行(稍后)。

我们可以使用getmypid来获得当前PID。

但根据PHP手册

进程ID不是唯一的,因此它们是一个弱熵源。我们建议不要在依赖安全的上下文中依赖pid。

我不能依赖PID。

我的第二个想法是将流程创建的时间存储到数据库中。

如何获取当前脚本创建时间?稍后,我如何与tasklist进行比较,以检查特定脚本是否正在运行?

我在共享主机windows/linux环境中运行。

来自php.net/getmypid

几乎不需要修改就可以禁用非cli访问。

可以使用CCD_ 2来执行脚本。

另外,使用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(它们对于特定的时间点是唯一的,因此不会有两个进程运行相同的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.

希望这能帮助到你。