如何在PHP中阻止多个用户同时访问单个方法


How to block multiple users accessing single method at same time in PHP?

我正在开发一个记录存储系统,它将扫描、索引和加密的记录存储在物理盒子中。

我有一个方法说"getAvailablePlace()",它检查什么框和什么seq可用于存储。我想锁定这个方法。例如,当一个用户进入这个方法时,他得到box:12 seq:55作为空位置,同时另一个用户访问相同的方法,他也可能得到相同的值。Box:12 seq:55容易出错

如果我可以锁定这个方法当一个用户已经进入这个进程?

我正在使用SQLite, wamp和codeigniter

我有这个代码在使用:

define('LOCK_FILE', "/path/to/your/lockfile-".$argv[1].".lock");
if( isLocked() ) die("ALREADY RUNNING !!!!'n" );
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;
} 

你可以修改它不检查pid,只使用文件作为锁信息

这里有一个通用的方法:使用另一个表来存储当前"锁定"的框。然后展开"getAvailablePlace()",在生成下一个框id之前检查锁定的框。生成box id后,将其写入锁表。这三个操作必须在数据库事务中进行。

另一个解决方案是计算数据库中每个盒子的序列号。如果您在事务中执行"获取框y的最大序列,对其加1,并将其写回来"的操作,则应该没问题。

你不能在PHP中这样做,因为每个用户都有自己的'运行时'。但你可以用一些外部方法来做,例如数据库中的locks表。因此,您的函数检查表中是否存在某些记录,跳过/返回false或任何情况,如果不是,则运行受保护的代码。

请注意,您必须对真正没有错误的代码实现双重检查。