Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果另一个执行php脚本,则阻止它执行_Php_Mysql_Mysqli - Fatal编程技术网

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

如果另一个执行php脚本,则阻止它执行,php,mysql,mysqli,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

我有以下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';
 }     

?>

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


睡眠时,如果脚本在另一个选项卡中运行,我希望状态为1,并应输入echo
cron_块
,但如果its=0,则应与第一个选项卡相同。

如果我使用ENGINE=InnoDB创建表并将autocommit设置为FALSE,我可以重现您的案例。这是我的测试代码,与您的测试代码大致相同,只是强制将autocommit设置为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;");
}
因此,请仔细检查您的表是否使用支持事务的存储引擎,以及默认的自动提交设置是什么

致以最良好的祝愿


Ken解决了这个问题,因为我在同一个浏览器(firefox)中用两个选项卡运行同一个脚本

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

另外,当在同一浏览器上使用localhost/script.php和其他192.10.1.5/script.php运行第一个和其他192.10.1.5/script.php并使用不同的选项卡时,行为与我预期的一样


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

在睡眠期间,状态将是1,对吗??它的用途是什么?您使用的存储类型是什么?有事务支持吗?自动提交设置是什么?如果您正在使用事务存储,但未将“自动提交”设置为true,则在您提交之前,您的更新将一直处于隐藏状态,并且其他连接可能能够读取旧值。我希望您的状态对于不同的选项卡会有所不同,您应该能够测试会话id是否仍然为samestatus is int(1):0或1cron_statuses ENGINE=InnoDBIf是,添加mysqli_自动提交($Connect,TRUE);在mysqli_set_字符集($Connect,“utf8”)之后;再试一次!我在“mysqli\u autocommit($Connect,TRUE)之后添加了“mysqli\u set\u charset($Connect,utf8”);同样的问题。如果我在一个页面启动后将exit放在页面顶部,则第二个页面将被卡住。问题似乎是脚本被卡住了或类似的事情。