gpt4 book ai didi

PHP MySQL 获取锁

转载 作者:行者123 更新时间:2023-11-29 02:36:05 25 4
gpt4 key购买 nike

在一个脚本中,我尝试使用 MySQL GET_LOCK 检查是否已在运行相同的脚本。问题是,当脚本试图获取锁时,它不是免费的,无论我提供的参数如何,它都会永远阻塞。

<?php

class Controller_Refresher extends Controller {
public function action_run($key) {
echo date('H:i:s'."\n", time());
$this->die_if_running();
$this->run();
echo date('H:i:s'."\n", time());
}

private function die_if_running() {
$result = DB::query(Database::SELECT, "SELECT IS_FREE_LOCK('refresher_running') AS free")->execute();
if (! intval($result[0]['free'])) die('Running already');
$result = DB::query(Database::SELECT, "SELECT GET_LOCK('refresher_running', 1)")->execute();
}

private function run() {
echo "Starting\n";
ob_flush();
sleep(10);

DB::query(Database::SELECT, "SELECT RELEASE_LOCK('refresher_running')")->execute();
}
}

当我在浏览器的 2 个选项卡中运行它时,我得到例如:

-tab 1-
20:48:16
Starting
20:48:26
-tab 2-
20:48:27
Starting
20:48:37

虽然我想做的是使第二个选项卡 die('Running already');

最佳答案

注意 - 这个问题实际上可能是由 php 锁定 session 文件引起的:

https://stackoverflow.com/a/5487811/539149

所以你应该在任何需要并发运行的代码之前调用session_write_close()。我在尝试这个 Mutex 类后发现了这一点:

http://code.google.com/p/mutex-for-php/

类(class)效果很好,但我的 PHP 脚本仍在一个接一个地运行!

此外,您不需要 IS_FREE_LOCK()。只需调用 GET_LOCK('refresher_running', 0) ,如果它给你锁,它会返回 1,如果锁被占用,它会返回 0。这样更原子化。当然,锁定超时在某些情况下仍然有用,例如当您想要对任务进行排队时,但如果同时请求太多,请注意脚本超时。

扎克·莫里斯

关于PHP MySQL 获取锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4908909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com