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

时间:2011-08-11 10:55:50

标签: php sqlite codeigniter

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

我有一个方法说“getAvailablePlace()”,它会检查哪个框以及哪些seq可用于存储。我想锁定这个方法。即当一个用户进入这个方法并且他得到了盒子:12 seq:55作为空的地方..同时另一个用户正在访问相同的方法他也可能得到相同的值..box:12 seq:55这是错误易发生。

那么,当一个用户已进入此过程时,我是否可以锁定此方法?

我正在使用SQLite,wamp和codeigniter。

3 个答案:

答案 0 :(得分:1)

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

另一个解决方案是为每个框计算数据库中的序列号。如果您执行操作“获取框y的最大序列,添加1,将其写回”在交易中您应该没问题。

答案 1 :(得分:1)

我正在使用此代码:

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,只需将文件用作锁定信息。

答案 2 :(得分:0)

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

请注意,您必须实现double-checking才能获得真正无错误的代码。