2014-09-10 153 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 /> 

下面是在cron作業每分鐘運行的代碼。

<?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 2014-09-10 17:58:45

+1

那麼你的託管公司的員工「無能」,我希望你不是「爲此付出太多的錢」。我的建議是在你的代碼上放一個計時器,因爲它可能需要一分多鐘才能完成,然後你將腳本的副本堆積起來,直到你用完MySQL連接。哪個問題更好,而不是耗盡內存或CPU資源。 – Sammitch 2014-09-10 18:01:09

+0

利用持久連接。 http://php.net/manual/en/mysqli.configuration.php#ini.mysqli.allow-persistent – 2014-09-10 18:01:44

回答

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命令僅在結果集不爲空時使用,並且仍然如此。但它總是讀取每個結果集。

此外,它不會獲取比您需要更多的行,因此它可能更有效。