PHP打开多个连接

时间:2013-04-25 15:02:53

标签: php mysql xampp

我想在不同的浏览器标签中运行同一脚本的多个脚本实例。我希望他们有不同的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表。

2 个答案:

答案 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.

我想再次尝试找哪个选项效果最好。