Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql连接太多警告_Php_Mysql - Fatal编程技术网

Php mysql连接太多警告

Php mysql连接太多警告,php,mysql,Php,Mysql,在运行此cron作业时,我不断遇到以下错误。它每分钟都在运行: 错误 警告:mysqli_connect():(08004/1040):第2行/home/eterna33/public_html/script/email_cron.php中的连接太多 警告:mysqli_query()要求参数1为mysqli,布尔值在第6行的/home/eterna33/public_html/script/email_cron.php中给出 警告:mysqli_fetch_array()希望参数1是my

在运行此cron作业时,我不断遇到以下错误。它每分钟都在运行:

错误


警告:mysqli_connect():(08004/1040):第2行/home/eterna33/public_html/script/email_cron.php中的连接太多

警告:mysqli_query()要求参数1为mysqli,布尔值在第6行的/home/eterna33/public_html/script/email_cron.php中给出

警告:mysqli_fetch_array()希望参数1是mysqli_result,在第8行的/home/eterna33/public_html/script/email_cron.php中给出空值

警告:mysqli_close()要求参数1为mysqli,布尔值在第19行的/home/eterna33/public_html/script/email_cron.php中给出
下面是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);
?>

每次运行此脚本时,您似乎都在检索超出需要的信息,然后放弃部分读取的结果集。您每次只能处理三个项目。放弃的结果集对于数据库服务器来说不是很好

我建议您更改此查询:

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]'");
}

mysqli_close($con);
if ($count > 0) {
   echo "exit";
}
似乎您只希望在结果集不是空的情况下使用
echo
命令,而这仍然可以做到这一点。但它总是贯穿每个结果集


此外,它不会获取比您需要的更多的行,因此可能会更高效。

该错误意味着MySQL服务器有太多的活动连接。要么你的主机需要增加连接数,要么你需要一个新主机。那么,你的主机公司的员工“不称职”,我希望你不要为此“付出太多的钱”。我的建议是在您的代码上设置一个计时器,因为它可能需要超过一分钟的时间来完成,然后您会堆积脚本的副本,直到MySQL连接耗尽为止。这是一个更好的问题,而不是耗尽内存或CPU资源。使用持久连接。使用
mysqli
时,您应该使用参数化查询,并将用户数据添加到查询中。不要使用字符串插值来实现这一点,因为您将创建严重的。@CharlotteDunois通常这是一个好主意,但如果是cron作业,则进程以及与它的所有连接都将终止,因此在这种情况下,这并没有真正的帮助。
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";
}