当结果包含~100,000行时,mysqli_query停止执行php

时间:2016-12-30 03:45:42

标签: php mysql

我正在运行此代码:

<?php
$dbport         = 1578;
$dbhost         = "localhost";
$dbname         = "dbname";
$dbuser         = "dbuser";
$dbpswd         = "dbpswd";
$MySQLLink = mysqli_connect($dbhost, $dbuser, $dbpswd, $dbname, $dbport);
$query = "SELECT * FROM assets_advanced_records LIMIT 100000";
echo "running query ".$query."<br>";
$result = mysqli_query($MySQLLink, $query) or die("Query failed (".$query."): ".mysqli_error($MySQLLink));
echo "query succeeded<br>";
mysqli_close($MySQLLink);
?>

执行在mysqli_query()立即停止;页面不再加载。

输出如下:

running query SELECT * FROM assets_advanced_records LIMIT 100000

如果我将LIMIT减少到10000,我得到正确的输出:

running query SELECT * FROM assets_advanced_records LIMIT 10000
query succeeded

导致这种情况的原因是什么?

MySQL版本:5.7.12-0ubuntu1.1

PHP版本:7.0.8-0ubuntu0.16.04.3

执行停止时,我在控制台中得到了这个:

Failed to load resource: the server responded with a status of 500 (Internal Server Error)

更新:

检查/var/log/apache2/error.log我收到的错误如下:

[Fri Dec 30 15:13:23.983920 2016] [:error] [pid 1907] [client 10.10.6.116:54978] FastCGI: server "/usr/lib/cgi-bin/php7-fcgi" stderr: PHP message: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 806912 bytes) in /var/www/html/debug_tools2.php on line 491, referer: http://10.10.6.24/debug_tools2.php

1 个答案:

答案 0 :(得分:0)

错误日志是关键:

  

PHP致命错误:允许的内存大小为134217728字节耗尽

你内存不足。你有128MB的工作,你的结果集比那个大,所以剧本就废话了。

当你运行mysqli_query时,它会将整个结果集加载到内存中,因此有足够大的结果集对于已分配的内存量来说太大了。有几个解决方案:

分块,一次只能抓取~10000条记录

for ($offset=0;$offset<10;$offset++) {
$query = "SELECT * FROM assets_advanced_records LIMIT ".10000*$offset.", 10000";
//do stuff...
}

增加php的内存限制。如果您有权这样做:您目前处于128M,用

填充
ini_set('memory_limit','1G');

位于脚本的顶部,或者只是小心翼翼地使用

ini_set('memory_limit','-1')

使用无缓冲的查询。这不会将整个结果集加载到内存中。您可以通过mysqli_real_query了解mysqli_use_result以实现这一目标。进一步阅读:https://dev.mysql.com/doc/apis-php/en/apis-php-mysqlinfo.concepts.buffering.htmlunbuffered query with MySQLi?http://php.net/manual/en/function.mysql-unbuffered-query.php