2014-09-10 4 views
-1

이 cron 작업을 실행할 때 다음 오류가 계속 발생합니다.mysql이 너무 많음 연결 경고

오류

<br /> 
<b>Warning</b>: mysqli_connect(): (08004/1040): Too many connections in <b>/home/eterna33/public_html/script/email_cron.php</b> on line <b>2</b><br /> 


    <br /> 
    <b>Warning</b>: mysqli_query() expects parameter 1 to be mysqli, boolean given in <b>/home/eterna33/public_html/script/email_cron.php</b> on line <b>6</b><br /> 
    <br /> 
    <b>Warning</b>: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given in <b>/home/eterna33/public_html/script/email_cron.php</b> on line <b>8</b><br /> 
    <br /> 
    <b>Warning</b>: mysqli_close() expects parameter 1 to be mysqli, boolean given in <b>/home/eterna33/public_html/script/email_cron.php</b> on line <b>19</b><br /> 
다음

크론 작업에 매 분마다 실행되는 코드입니다 : 그것은 매 순간을 실행합니다.

<?php 
$con=mysqli_connect("localhost","**","****","***"); 



$result = mysqli_query($con, "SELECT * FROM mail WHERE status=false"); 
$count="0"; 
while($row = mysqli_fetch_array($result)) { 
     $count++; 
     mysqli_query($con, "UPDATE mail SET status=true WHERE id='$row[id]'"); 
     mail($row['send_to'], $row['subject'], $row['message'], $row['headers']); 
     mysqli_query($con, "DELETE FROM mail WHERE status=true AND id='$row[id]'"); 
     if ($count >= 3) { 
      echo "exit"; 
      mysqli_close($con); 

      exit; 
     } 
    } 

mysqli_close($con); 
?> 

나는 호스트에 연락했지만 코드를 디버깅하는 데 "훈련받지 못했다"고 말합니다. 나는 무엇이 잘못되었는지를 놓치고있다. 코드는 정상적으로 작동하며 단지 이러한 오류를 제공합니다.

+2

오류는 MySQL 서버에 너무 많은 활성 연결이 있음을 의미합니다. 호스트가 연결 수를 늘리거나 새 호스트가 필요합니다. – Machavity

+1

그러면 호스팅 회사의 직원이 "무능력합니다"라고 말하면서 "돈을 많이 내고 싶지 않다"고 생각합니다. 내 제안은 아마 당신의 코드에 타이머를 넣는 것일 것이다. 왜냐하면 아마도 1 분 이상 걸리고 나서 MySQL 연결이 끊어 질 때까지 스크립트 사본을 쌓아 올리기 때문이다. 메모리 나 CPU 리소스가 부족한 대신에 더 좋은 문제는 무엇입니까? – Sammitch

+0

영구 연결을 사용합니다. http://php.net/manual/en/mysqli.configuration.php#ini.mysqli.allow-persistent –

답변

0

이 스크립트를 실행할 때마다 필요한 것보다 많은 정보를 검색 한 다음 부분적으로 읽은 결과 집합을 버리는 것처럼 보입니다. 매번 세 항목 만 처리합니다. 포기 된 결과 집합은 데이터베이스 서버에 적합하지 않습니다.

난 당신이 쿼리 변경 제안 :

SELECT * FROM mail WHERE status=false 

그런

SELECT * FROM mail WHERE status=false LIMIT 3 

에를, 나는 다음과 같이 루프 코드를 변경 제안 :

$count = 0; 
while($row = mysqli_fetch_array($result)) { 
    $count++; 
    mysqli_query($con, "UPDATE mail SET status=true WHERE id='$row[id]'"); 
    mail($row['send_to'], $row['subject'], $row['message'], $row['headers']); 
    mysqli_query($con, "DELETE FROM mail WHERE status=true AND id='$row[id]'"); 
} 

mysqli_close($con); 
if ($count > 0) { 
    echo "exit"; 
} 

당신이 원하는 것 echo 명령은 결과 세트가 비어 있지 않은 경우에만 사용되며 여전히 결과 세트를 사용합니다. 하지만 항상 각 결과 집합을 통해 읽습니다.

또한, 필요한 것보다 많은 행을 가져 오지 않으므로 더 효율적일 수 있습니다.