2013-04-25 4 views
0

다른 브라우저 탭에서 같은 스크립트의 여러 스크립트 인스턴스를 실행하고 싶습니다. 그리고 나는 그들에게 다른 MySQL 연결을 갖기를 원합니다. 각각 고유 한 연결.PHP 다중 연결 열기

mysql_connect에는 새 링크를 열어야하는 제 4 매개 변수 $new_link이 있지만 그 경우에도 일반적으로 새 연결이 열리지 않습니다. 때로는 그렇습니다.

나는 과부 기계에 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 테이블이다.

+1

인스턴스 당 새 연결 수가 표준 동작입니다. 당신이 해결책을 찾으려고하는 특정 문제가 있습니까? – castis

답변

3

같은 스크립트의 여러 스크립트 인스턴스를 다른 브라우저 탭에서 실행하고 싶습니다. 그리고 나는 그들에게 다른 MySQL 연결을 갖기를 원합니다. 각각 고유 한 연결. 나는 절대적으로 스크립트의 각 인스턴스에 대해 새로운 연결을 열고 PHP/MySQL을 강제 할 수 있습니다 방법 :

질문은 추가 노력없이, 실제로는 경우입니다.

답변 :

+0

아니요, 스크립트는 약 2 분 동안 실행되며, 다른 스크립트가 끝날 때까지 기다리는 것을 볼 수 있습니다. MySQL에서 단 하나의 연결 만 항상 열려 있음을 알 수 있습니다 : SHOW STATUS LIKE '% onn %' – jQguru

+1

소리 SQL 쿼리가 완료되는 동안 테이블이 잠겨 있습니다. – castis

+0

테이블 잠금 장치를 사용합니까? 'my.cnf'에 parrallel 연결이 몇 개나 허용됩니까? 'root '계정을 사용하여 연결하고 있습니까? – hek2mgl

1

는 당신이 http://localhost/myscript.php 누를 때마다이 새로운 인스턴스가 실행됩니다 :) 아무것도하지 않습니다. 그 인스턴스에 관한 모든 것은 고유 한 것이므로 웹 서버는 모든 리소스, 연결, 변수가 고유 한 새로운 PHP 스레드를 생성합니다.

sessions과 같은 상태 관리 장치 만 공유되며 동일한 브라우저에서 다른 탭을 사용하는 경우에도 마찬가지입니다. 서로 다른 브라우저에서 동일한 URL을 사용하면 상태 관리 리소스도 달라집니다.

앞서 언급 한 다른 질문들과 마찬가지로 질문에 대답하려면 mysql_connect을 사용하는 경우 각 인스턴스마다 연결이 다릅니다. 응용 프로그램이 종료 될 때 닫히지 않는 영구 연결을 만들고 mysql_pconnect을 사용하여 새 연결 요청의 경우 reuses을 만들 수 있습니다. 그러나 귀하의 코드에서 후자를 사용하고있는 것으로 보이며이 경우에는 괜찮습니다.

당신은 내가 어떤 옵션을 찾기 위해 장난을 조금 걸릴 것 같아 다시

More information can be found here.

선택

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;에 대한 읽는 동안 테이블 실속을 방지하기 위해 읽기 수준 격리를 설정하려고 할 수 있습니다 가장 잘 작동합니다.

+0

10 개의 탭에서 동일한 스크립트를 실행합니다. 분명히 다른 스크립트를 기다리는 것을 볼 수 있습니다. phpMyAdmin이 일반적으로 단 하나의 연결 만 열려 있음을 분명히 알 수 있습니다. – jQguru

+0

@jQguru, 왜 그런 일이 일어나는지는 연결과 관련이 없습니다. 완전히 다른 연결이 있더라도 동일한 시스템에서 다른 시스템의 병렬 스크립트를 사용하는 경우 테이블이 잠긴다. 수행중인 조작의 유형에 따라 테이블 레벨 또는 행 레벨 잠금에 대한 변형이 있습니다. 이것은 새로운 또는 기존 연결과 아무 상관이 없습니다. 설명을 주셔서 감사합니다. – raidenace

+0

. 질문에 스크립트의 MySQL 관련 발췌 내용을 게시했습니다. 뭔가가 테이블을 잠글 수 있습니다. – jQguru