2012-02-26 4 views
2

다음과 같은 기능을 사용하면 MySQL의 스팸 때문에PHP»싱글 MySQL을 연결

function dbconn($autoclean = false, $mysql_close = false) 
{ 
    global $mysql_host, $mysql_user, $mysql_pass, $mysql_db; 
    mysql_connect($mysql_host, $mysql_user, $mysql_pass); 
    mysql_select_db($mysql_db); 

    userlogin(); 

    if ($autoclean) 
     register_shutdown_function("autoclean"); 

    if ($mysql_close) 
     register_shutdown_function("mysql_close"); 
} 

은 음 ... 나는 내 전용 서버에 의해보고 된 적이 MySQL의 연결을위한 기존의 방법을 사용하여 싱글 "같은 것입니다 연결 ", 그래서 나는 MySQL을위한 싱글 톤 코드를 작성하지만 스팸은 여전히 ​​거기에있다.

<?php 
    class mysql { 
     private static $instance; 
     private $res; 
     private function __construct() 
     { 
      $this->res = mysql_connect('localhost','user','password'); 
      mysql_select_db('database', $this->res); 
     } 
     public static function getinstance() { 
      if(!isset(self::$instance)) { 
       $c = __CLASS__; 
       self::$instance = new $c; 
      } 
      return self::$instance; 
     } 
     public function getres() { 
      return $this->res; 
     } 
    } 
?> 

및 기능 ...

function dbconn($autoclean = false, $mysql_close = false, $file = '') 
{ 
    require_once("MySQL.php"); 
    $m = mysql::getinstance(); 
    $m->getres(); 

    userlogin(); 

    if ($autoclean) 
     register_shutdown_function("autoclean"); 

    //if ($mysql_close) 
    // register_shutdown_function("mysql_close"); 
} 

감사합니다!

+0

..를 사용하고 스팸 .. 여전히 호스트 관리자에 대해 얘기 정말 확실하지 –

+0

입니다. 'dbconn()'을 여러 번 호출했지만 스팸과 아무 상관이 없으며, 활성 연결을 줄이거 나 스팸을 보내지 않을 수도 있지만 싱글 톤으로 전환하면 스크립트 당 여러 연결을 열 수 있습니다 멀리도. –

+0

@Michael, 대답을 주셔서 감사합니다 –

답변

1

여전히 요청 당 연결이 열립니다. 사이트의 인기가 높고 서버 구성이 느리거나 잘못 구성된 경우 많은 수의 동시 연결로 이어질 수 있으며 데이터베이스를 더 이상 질식시킬 수 있습니다. 이 경우 서버 나 hoster 만 변경하는 것이 좋습니다)

물론 쿼리가 느려질 수 있으며 MySQL에서 과부하가 발생할 수 있습니다. 귀하의 사이트가 실제로 인기가 있다면.

1

싱글 톤은 단일 방문자에 대한 단일 HTTP 요청의 길이 동안 지속되며 따라서 일부 캐싱을하지 않는 한 지워집니다. 따라서 연결 스패밍은 요청 당 것입니다. 여기에 설명 된 연결 풀링과 같은 것이 있습니다. Connection pooling in PHP.

0

나는 '스팸성 mysql 연결'에 대해 들어 본 적이 없다. 사용 가능한 연결의 제한된 풀에서 많은 양의 mysql 연결을 사용할 것입니다.

그런 경우 persistent MySQL connections이 도움이 될 수 있습니다.

하지만 read the manual regarding mysql_pconnect주세요! 이 힌트는 설명서에서 유일한 함정이 아닙니다 :

'참고로 이러한 종류의 링크는 PHP 버전의 모듈을 사용하는 경우에만 작동합니다. 자세한 내용은 영구 데이터베이스 연결 섹션을 참조하십시오. '

는 '영구 연결은 일반적인 접속에 일대일로 대응되도록 설계되었다. 즉, 항상 은 영구 연결을 영구적 인 연결로 대체해야하며 스크립트 동작 방식은 변경되지 않습니다. (아마도)은 스크립트의 효율성을 변경할 수 있지만 동작은 변경하지 않습니다! '

은으로 잘못 ... '스팸'문제가 더 큰 얻을, 싱글 톤이 작동하지

+0

그런 경우 영구적 인 MySQL 연결을 사용하면 훨씬 더 많은 문제가 발생합니다. –

+0

그 이유를 설명하십시오. 영구 연결을 무제한으로 만들 것을 제안하지 않습니다 ... – SteAp

+0

영구 연결을 사용 해본 적이 있습니까? –