如何限制 PHP 脚本的 1 个实例,我的解决方案有什么问题


How to limit 1 instance of a PHP script, what's wrong with my solution

<?PHP
define('TEMPPATH', '/tmp/');
$fp = fopen(TEMPPATH.'abc.php.lock', 'a+');
if(!flock($fp, LOCK_EX | LOCK_NB))
    exit;

我使用上面的代码来限制脚本运行多个实例,当我测试它时还可以,但是今天当我登录到我的服务器(CentOS 6)时,我看到两个实例正在运行,怎么会发生这种情况?

[root@server user]# ps aux | grep abc
root     21061  0.0  0.1 103284  2016 pts/0    S+   15:45   0:00 grep abc
user     22560  0.0  1.2 154608 12788 ?        Ss   Nov10   1:35 /usr/bin/php /path/abc.php
user     25106  0.0  1.3 154896 13336 ?        Ss   Nov06   2:51 /usr/bin/php /path/abc.php

该脚本是从 crontab 作业启动的,crontab 尝试每分钟运行一次,有没有更好的方法可以做到这一点?

非常精细的实例控制:)。

看看我的:

function par_processes($name = null,$ownPids = array(),$dbg = false){
    exec("ps x | grep $name", $ProcessState);
    $modifier = 0;
    while (list($idp,$procs) = each($ProcessState)){
        if (preg_match("/grep/i",$procs)) {
            unset($ProcessState[$idp]);
        }else{
            if (!empty($ownPids)){
                if (in_array(strstr(trim($procs)," ",true),$ownPids)){
                    unset($ProcessState[$idp]);
                }
            }
        }
    }
    if (!$dbg){
        return (count($ProcessState) - $modifier);
    }else{
        return array(0=>(count($ProcessState) - $modifier),1=>$ProcessState,2=>$ownPids);
    }
}

我进一步讨论之前,在 php 守护程序中,我使用它:

# INSTANCE CHECK    
if (par_processes("MYSOFTWARENAME",array(getmypid()))){
    error_log("SOME ERROR"); die();
}

坦率地说,它可以更快、更有效(可能)完成,但它可以完成这项工作。当然,您需要能够运行exec()才能正常工作。

相关文章: