我想在不同的浏览器标签中运行同一脚本的多个脚本实例。我希望他们有不同的MySQL连接。每个独特的连接。
我知道mysql_connect
有第四个参数$new_link
,它应该打开一个新链接,但即使这样也不会打开新连接。有时它确实如此。
我在Widows机器上安装了XAMPP。
问题是:我如何绝对强制PHP / MySQL为每个脚本实例打开一个新连接?脚本运行大约2分钟。
http://localhost/myscript.php
以下是MySQL代码的摘录。首先从DB加载工作分配并将其标记为正在进行中:
public function loadRange() {
try{
$this->db()->query('START TRANSACTION');
$this->row = $this->db()->getObject("
SELECT * FROM {$this->tableRanges}
WHERE
status = " . self::STATUS_READY_FOR_WORK . "
AND domain_id = {$this->domainId}
ORDER BY sort ASC
LIMIT 1");
if(!$this->row) throw new Exception('Could not load range');
$this->db()->update($this->tableRanges, $this->row->id, array(
'thread_id' => $this->id,
'status' => self::STATUS_WORKING,
'run_name' => $this->runName,
'time_started' => time(),
));
$this->db()->query('COMMIT');
} catch(Exception $e) {
$this->db()->query('ROLLBACK');
throw new Exception($e->getMessage());
}
}
然后,脚本可能会也可能不会根据它找到的内容插入另一个表中的行。
最后,当任务完成时,分配行再次更新:
$this->db()->update($this->tableRanges, $this->row->id, array(
'status' => self::STATUS_EXECUTED,
'time_finished' => time(),
'count' => $count,
));
特别是,$this->tableRanges
表看起来已被锁定。知道为什么会这样吗?它是一个InnoDB表。
答案 0 :(得分:3)
我想在不同的浏览器标签中运行同一脚本的多个脚本实例。我希望他们有不同的MySQL连接。每个独特的连接。
实际上就是这种情况,没有任何额外的努力
问题是:我如何绝对强制PHP / MySQL为每个脚本实例打开一个新连接。
答案:什么也不做。)
答案 1 :(得分:1)
每次点击http://localhost/myscript.php
时,都会运行一个新实例。关于该实例的所有内容都是唯一的,Web服务器会生成一个新的PHP线程,其中所有资源,连接和变量都是唯一的。
如果您在同一浏览器中使用不同的标签,则只共享sessions
等状态管理设备。如果您使用不同的浏览器访问相同的URL,则状态管理资源也不同。
要像之前提到的其他人一样回答您的问题 - 如果您使用mysql_connect
,则每个实例的连接都不同。您可以创建一个持久连接,该连接在应用程序退出时不会关闭,reuses
用于使用mysql_pconnect
的新连接请求。但是在您的代码中,您似乎正在使用后者,在这种情况下,您没事。
您可以尝试设置隔离读取级别,以防止在读取select
时表停顿 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
More information can be found here.
我想再次尝试找哪个选项效果最好。