阻止执行php脚本,如果另一个执行它

时间:2015-07-02 09:07:59

标签: php mysql mysqli

我有以下PHP代码:

<?php
 $host = "localhost";
 $username = "root";
 $pw = "root";
 $db_name = "marketing";

 $Connect = mysqli_connect($host, $username, $pw) or die("Couldn't connect to+ MySQL:<0br>" . mysqli_error($Connect) . "<br>" . mysqli_errno($Connect));

 $Db = mysqli_select_db($Connect, $db_name)or die("Couldn't select database:<br>" . mysqli_error($Connect). "<br>" . mysqli_errno($Connect));

 mysqli_set_charset($Connect, "utf8");

 mysqli_autocommit($Connect,TRUE);  

 $query1 = "select status from cron_statuses where offset = 0";
 $res = mysqli_query($Connect, $query1); 
 $status = mysqli_fetch_assoc($res);

 if (!$status['status']){

    $query2 = "update cron_statuses set status = 1 where offset = 0";
    $res = mysqli_query($Connect, $query2);

    //do something
    sleep(20);

     $query2 = "update cron_statuses set status = 0 where offset = 0";
     $res = mysqli_query($Connect, $query2);
}
else{
    echo 'cron blocked';
 }     

?>

status = 0的默认值。如果我运行脚本,它将状态更新为1,然后休眠20秒并将状态更新回0。

Whiles睡觉,如果脚本在另一个标签中运行,我希望状态等于1,并且应该输入echo cron_block但是如果它= 0,它应该与第一个标签相同。< / p>

2 个答案:

答案 0 :(得分:0)

如果我使用ENGINE = InnoDB创建表并将autocommit设置为FALSE,我可以重现您的情况。这是我的测试代码,或多或少与您的相同,除非强制设置自动提交为FALSE:

$dbconn = mysqli_connect("localhost","root","password");
$db = mysqli_select_db($dbconn,"test");

mysqli_autocommit($dbconn,FALSE);

$res = mysqli_query($dbconn,"SELECT status FROM test WHERE offset = 0;");
$status = mysqli_fetch_assoc($res);
if ( $status['status'] == 0 ) {
    $res = mysqli_query($dbconn,"UPDATE test SET status = 1 WHERE offset = 0;");
    sleep(10);
    $res = mysqli_query($dbconn,"UPDATE test SET status = 0 WHERE offset = 0;");
}

因此请仔细检查您的表是否正在使用支持事务的存储引擎,以及默认的自动提交设置。

最诚挚的问候,

答案 1 :(得分:0)

这个问题是因为我在同一个浏览器(firefox)中使用2个标签运行相同的脚本。

当我在firefox上运行第一个而在chrome中运行第二个时,行为就像我预期的那样。

另外,当第一个使用localhost / script.php和另一个192.10.1.5/script.php在同一个浏览器上运行不同的标签时,行为就像我预期的那样。

我不知道为什么但问题不在代码中。