mysqli_query停止执行PHP〜100,000行
我运行这段代码:立即mysqli_query停止执行PHP〜100,000行
<?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
如果我减少限制设置为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)
UPDATE:
检查/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
错误日志是关键:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
你跑出来的内存。你有128MB的工作空间,并且你的结果集比那个大,所以脚本被废弃了。
当你运行mysqli_query
加载整个结果集到内存中,因此它是有道理的,足够大的结果集将是记忆的PHP量已经分配过大。有几个解决方案:
• 分块,只是在时间
for ($offset=0;$offset<10;$offset++) {
$query = "SELECT * FROM assets_advanced_records LIMIT ".10000*$offset.", 10000";
//do stuff...
}
• 增加PHP的内存限制抢〜10000条记录。如果您有权这样做:您目前在128M,在你的脚本的顶部
ini_set('memory_limit','1G');
托住它,或只是扔谨慎的风和最大程度的发挥与
ini_set('memory_limit','-1')
• 使用无缓冲查询。这不会将整个结果集加载到内存中。您可以使用mysqli_use_result
阅读mysqli_real_query
来实现。进一步阅读:https://dev.mysql.com/doc/apis-php/en/apis-php-mysqlinfo.concepts.buffering.html,unbuffered query with MySQLi?,http://php.net/manual/en/function.mysql-unbuffered-query.php
是的,这是做到了。看起来查询需要大约268MB。我刚刚编辑/etc/php/7.0/fpm/php.ini并增加了memory_limit。谢谢回答! – ChelseaB
您是否试图在单页中打印所有100000条记录? –
如果是这样,你可以使用分页这 –
不,我只是有点担心查询不失败或超时,但只是停止执行(这似乎不像正常行为)。上面的代码是专门为测试这个问题编写的。我实际上并不需要运行该查询,但我需要知道为什么它在未来出现时无法运行。 – ChelseaB