2014-09-10 2 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

Хорошо, тогда персонал вашей хостинговой компании «некомпетентен», и я надеюсь, что вы не «платите слишком много денег» за это. Мое предложение было бы поставить таймер на ваш код, потому что он, вероятно, занимает больше минуты, чтобы завершить, а затем вы набираете копии сценария, пока не закончите соединения MySQL. Какая проблема лучше, чем нехватка памяти или ресурсов ЦП. – 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 используется только в том случае, если набор результатов не был пустым, и это все еще делает это. Но он всегда читает весь путь до каждого набора результатов.

Кроме того, он не получает больше строк, чем вам нужно, поэтому он может быть более эффективным.

Смежные вопросы