php代码像数据库中的事务?

时间:2014-10-30 15:18:20

标签: php session laravel

我有一些代码,我希望一次只能由一个用户运行。我不想让儿子复杂的锁/会话依赖系统,我只是希望延迟用户请求我们返回一些消息再试一次。

代码实际上是ssh / powershell连接,所以我想隔离它。

有没有方便的方法呢?

我忘记了它是laravel / php代码。

1 个答案:

答案 0 :(得分:0)

您需要获得某种“锁定”。如果没有锁,没有人访问任何东西。如果有锁,有人正在访问某些内容,其余的应该等待。最简单的方法是使用文件实现此操作并获取独占锁。我将发布一个示例类(未经测试)和示例用法。您可以使用以下示例代码派生一个工作示例:

class MyLockClass
{
    protected $fh = null;
    protected $file_path = '';

    public function __construct($file_path)
    {
        $this->file_path = $file_path;
    }

    public function acquire()
    {       
        $handler = $this->getFileHandler();

        return flock($handler, LOCK_EX);
    }

    public function release($close = false)
    {
        $handler = $this->getFileHandler();

        return flock($handler, LOCK_UN);

        if($close) 
        {
            fclose($handler);
            $this->fh = null;
        }
    }   

    protected function acquireLock($handler)
    {
        return flock($handler, LOCK_EX);
    }

    protected function getFileHandler()
    {
        if(is_null($this->fh))
        {
            $this->fh = fopen($this->file_path, 'c');

            if($this->fh === false)
            {
                throw new \Exception(sprintf("Unable to open the specified file: %s", $this->file_path));
            }
        }

        return $this->fh;
    }
}

用法:

$lock = new MyLockClass('/my/file/path');

try
{
    if($lock->acquire())
    {
        // Do stuff

        $lock->release(true);
    }
    else
    {
        // Someone is working, either wait or disconnect the user
    }
}
catch(\Exception $e)
{
    echo "An error occurred!<br />";
    echo $e->getMessage();
}