0

我想在不同的浏览器选项卡中运行同一脚本的多个脚本实例。我希望他们有不同的 MySQL 连接。每个都有其独特的联系。

我知道它mysql_connect有第四个参数$new_link应该打开一个新链接,但即使这样通常也不会打开一个新连接。有时确实如此。

我在 Widows 机器上安装了 XAMPP。

问题是:我如何绝对强制 PHP/MySQL 为脚本的每个实例打开一个新连接?脚本运行大约 2 分钟。

http://localhost/myscript.php

以下是 MySQL 代码的摘录。首先从数据库加载一个工作分配并将其标记为进行中:

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 表。

4

2 回答 2

3

我想在不同的浏览器选项卡中运行同一脚本的多个脚本实例。我希望他们有不同的 MySQL 连接。每个都有其独特的联系。

实际情况就是这样,无需任何额外的努力

问题是:我如何绝对强制 PHP/MySQL 为脚本的每个实例打开一个新连接。

答:什么都不做:)

于 2013-04-25T15:05:02.050 回答
1

每次您点击http://localhost/myscript.php一个新实例时都会运行。该实例的所有内容都是唯一的,Web 服务器生成一个新的 PHP 线程,其中所有资源、连接、变量都是唯一的。

只有状态管理设备,例如sessions,如果您在同一浏览器中使用不同的选项卡,也可以共享。如果你用不同的浏览器点击相同的 URL,状态管理资源也会不同。

要回答您的问题,就像之前提到的其他人一样 - 如果您使用的是每个实例,您的连接是不同的mysql_connect。您可以创建一个在应用程序退出时不会关闭的持久连接,并且reuses使用mysql_pconnect. 但是在您的代码中,您似乎使用的是后者,在这种情况下,您很好。

您可以尝试设置隔离读取级别,以防止在读取选择时表停滞

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;

更多信息可以在这里找到。

同样,我想需要花点时间才能找到最有效的选项。

于 2013-04-25T15:19:22.817 回答