php/mysql可以';不要同时运行同一文件两次
我试图让一个“机器人”做一些数据处理,但不知道如何运行同一个文件两次,并加快处理同一文件的多个进程 我的代码:php/mysql可以';不要同时运行同一文件两次,php,mysql,centos,server,Php,Mysql,Centos,Server,我试图让一个“机器人”做一些数据处理,但不知道如何运行同一个文件两次,并加快处理同一文件的多个进程 我的代码: while($stop != 1){ $result = $mysqli->query("SELECT * FROM `data` WHERE `state` = 'nothing' ORDER BY `id` DESC"); $row = $result->fetch_assoc(); if(empty($row)){ echo
while($stop != 1){
$result = $mysqli->query("SELECT * FROM `data` WHERE `state` = 'nothing' ORDER BY `id` DESC");
$row = $result->fetch_assoc();
if(empty($row)){
echo $i." stop";
$stop = 1;
}else{
echo "do ".$i."<br/>";
$mysqli->query("UPDATE `data` SET `state` = 'done' WHERE `id` = '{$row['id']}'");
}
$i++;
}
(数据库中大约有3000行)
但是,如果我第二次运行同一个文件,它什么也不做,只是等待另一个文件完成,然后只写“1 stop”,这意味着即使我同时启动这些文件,它也没有做任何事情
我注意到,如果我同时启动两个文件并取消第一个文件的执行,那么第二个文件仅从1个id开始,即使有500行已经处于状态
='nothing'
这让我现在明白了。。。这是php还是mysql的问题?如何使一个文件运行两次处理不同的数据而不像这样挂断
CentOS 6.6版(最终版)
PHP 5.3.28(cli)(构建时间:2014年7月21日12:19:25)
尝试使用不同的查询
例:
localhost/a.php?进程=1
localhost/a.php?进程=2
这将使您的文件在同一时间运行两次您的mysql表在更新过程中被锁定您需要进行读取,特别是如果您的表使用MyISAM引擎。作为之前两条注释的补充,两个程序可以同时执行选择(我不认为读取锁定ressource),因此它们都将具有所有行。然后,如果你停止一个,第二个将不会更新关于他所做选择的知识。所以他还是会穿过所有的行。。。为了避免这种情况,您还可以在更新之前检查数据状态,以查看在选择之后是否已被其他程序捕获…我正在使用MyISAM,切换到InnoDB帮助会不会?我无法真正避免更新表,因为脚本需要查看哪些数据已被处理@这就是你说的吗?用一个代码更新了第一篇帖子我刚才说的是if条件,你不必在
else
中更新$result
和$row
,这对性能来说会很有戏剧性。
do 1
do 2
do 3
do 4
do 5
do 6
do 7
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.5.38 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+------------------------------+