PHPでミューテックスを構築するためにMYSQLロックを使用しようとしています。
ユーザーごとに 1 つのプロセスがあり、各プロセスを一度に 1 つずつ実行したいと考えています。
ユーザー「my_user」の1つのプロセスが「my_user」の他のプロセスが存在することを確認した場合、新しいプロセスは別の方法をとります。たとえば、このユーザーのプロセスがすでに実行されていることを報告するコードの一部です。
このテスト コードを取得しましたが、GET_LOCK 関数が 2 番目のインスタンスで 1 秒以上待機していることがわかります。なぜですか?
//name of the lock
$user = "my_user";
//calling get_lock with 1 second as timeout
$i_sql = "SELECT GET_LOCK('$user', 1)";
if($debug) file_put_contents($logfile, "$i_sql \r\n", FILE_APPEND);
$result = mysqli_query($con, $i_sql);
if (!$result) {
echo "Could not successfully run query ($i_sql) from DB: " . mysql_error();
exit;
}
echo "Adquired ".date('Y-m-d H:i:s')."<br>";
$row = mysqli_fetch_array($result);
print_r($row);
echo "<br>";
$count = 0;
//stay here 10 seconds
while($count < 2){
sleep(5);
$count++;
}
//release the lock
$i_sql = "SELECT RELEASE_LOCK('$user')";
if($debug) file_put_contents($logfile, "$i_sql \r\n", FILE_APPEND);
$result = mysqli_query($con, $i_sql);
if (!$result) {
echo "Could not successfully run query ($i_sql) from DB: " . mysql_error();
exit;
}
echo "Release ".date('Y-m-d H:i:s')."<br>";
mysqli_close($con);
unset($con);
出力:
10:00:07 に起動されたプロセス 1 :
Adquired 2013-07-08 10:00:08
Array ( [0] => 1 [GET_LOCK('my_user', 1)] => 1 )
Release 2013-07-08 10:00:18
10:00:08 に起動されたプロセス 2 :
Adquired 2013-07-08 10:00:18
Array ( [0] => 1 [GET_LOCK('my_user', 1)] => 1 )
Release 2013-07-08 10:00:28