PHP打开多个连接

PHP打开多个连接,php,mysql,xampp,Php,Mysql,Xampp,我想在不同的浏览器选项卡中运行同一脚本的多个脚本实例。我希望他们有不同的MySQL连接。每一个都有其独特的联系 我知道它有第四个参数$new\u link,它应该打开一个新链接,但即使这样,通常也不会打开一个新连接。有时的确如此 我在Widows机器上安装了XAMPP 问题是:如何绝对强制PHP/MySQL为脚本的每个实例打开新的连接?脚本运行大约2分钟 http://localhost/myscript.php 下面是MySQL代码的摘录。首先从DB加载工作分配,并将其标记为正在进行: pub

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

我知道它有第四个参数
$new\u 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表

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

事实就是这样,没有任何额外的努力

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

答:什么也不做:)

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

事实就是这样,没有任何额外的努力

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


回答:什么也不做:)

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

只有状态管理设备(如
会话
)是共享的,如果您在同一浏览器中使用不同的选项卡,也是共享的。如果使用不同的浏览器访问相同的URL,则状态管理资源也会不同

要回答您的问题,就像前面提到的其他问题一样,如果您使用的是
mysql\u connect
,那么每个实例的连接都是不同的。您可以创建一个在应用程序退出时不会关闭的持久连接,并使用
mysql\u pconnect
将其重新用于新的连接请求。但是在你的代码中,你似乎在使用后者,在这种情况下,你很好

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

设置事务隔离级别读取未提交


再一次,我想,要想找到哪一个选项最有效,还需要一点时间。

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

只有状态管理设备(如
会话
)是共享的,如果您在同一浏览器中使用不同的选项卡,也是共享的。如果使用不同的浏览器访问相同的URL,则状态管理资源也会不同

要回答您的问题,就像前面提到的其他问题一样,如果您使用的是
mysql\u connect
,那么每个实例的连接都是不同的。您可以创建一个在应用程序退出时不会关闭的持久连接,并使用
mysql\u pconnect
将其重新用于新的连接请求。但是在你的代码中,你似乎在使用后者,在这种情况下,你很好

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

设置事务隔离级别读取未提交


同样,我想需要花点时间来找出哪个选项最有效。

每个实例的新连接是标准行为。您是否有特定的问题需要解决?每个实例的新连接是标准行为。您是否有一个特定的问题要解决?不,脚本运行了大约2分钟,我看到一个等待另一个完成,我从MySQL中看到,只有一个连接一直处于打开状态:在本例中显示状态,如“%onn%”,听起来您的表在sql查询完成时被锁定。是否使用表锁?
my.cnf
中允许多少并行连接?您是否使用
root
帐户进行连接?看起来您正面临单线程浏览器的限制。尝试Chrome并再次检查脚本行为;)@castis是的,我也这么认为,但表是InnoDB,我确实启动事务、选择、更新、COMMITNope,脚本运行了大约2分钟,我看到一个等待另一个完成,我从MySQL中看到,始终只有一个连接处于打开状态:在本例中,显示类似“%onn%”的状态,听起来您的表在sql查询完成时被锁定。是否使用表锁?
my.cnf
中允许多少并行连接?您是否使用
root
帐户进行连接?看起来您正面临单线程浏览器的限制。尝试Chrome并再次检查脚本行为;)@castis是的,我也这么认为,但表是InnoDB,我确实启动事务、选择、更新、提交,在10个选项卡中运行相同的脚本,我清楚地看到一个等待另一个,我清楚地看到phpMyAdmin通常只有一个连接打开。@jQguru,发生这种情况的原因与连接无关。即使您有完全不同的连接,如果您有来自diff的并行脚本