2013-04-25 143 views
0

我想在不同的浏览器标签中运行同一脚本的多个脚本实例。我希望他们有不同的MySQL连接。每一个独特的连接。PHP打开多个连接

我知道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表。

+1

每个实例的新连接是标准行为。你是否遇到了一个特定的问题,你正试图寻找解决方案? – castis 2013-04-25 15:05:49

回答

3

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

这是真正的情况,没有任何额外的努力

的问题是:我怎么能强制绝对PHP/MySQL来打开一个新的连接的脚本的每个实例。

答:做:)

+0

不,脚本运行了大约2分钟,我看到一个人等待另一个完成,我从MySQL看到,一直只有一个连接打开:SHOW STATUS LIKE'%onn%' – jQguru 2013-04-25 15:07:47

+1

在这种情况下,声音你的表在SQL查询完成时锁定。 – castis 2013-04-25 15:08:46

+0

你用桌子锁吗? 'my.cnf'允许多少个并行连接?你使用'root'帐户连接吗? – hek2mgl 2013-04-25 15:08:57

1

每次打http://localhost/myscript.php时间一个新的实例在运行什么。与该实例有关的所有内容都是唯一的,Web服务器产生一个新的PHP线程,其中所有的资源,连接,变量都是唯一的。

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

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

您可以尝试设置隔离阅读水平,以防止表失速而阅读选择

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;

More information can be found here.

再次我想这将需要一些打四处打听哪个选项运作最好。

+0

我在10个选项卡中运行相同的脚本,我清楚地看到一个等待另一个,我清楚地看到phpMyAdmin通常只有一个连接打开。 – jQguru 2013-04-25 15:25:13

+0

@jQguru,为什么发生与连接无关。即使你有完全不同的连接,如果你在同一个表上尝试操作的不同机器上也有并行脚本,那么表就会被锁定。根据所执行操作的种类,表格级别或行级别锁定存在变化。这与新的或现有的连接无关.. – raidenace 2013-04-25 15:31:00

+0

感谢您的解释。我已经在这个问题上发布了MySQL脚本的相关摘录。有什么可能会锁定表。 – jQguru 2013-04-25 15:37:18