2016-12-30 52 views
1

我運行這段代碼:立即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 
+1

您是否試圖在單頁中打印所有100000條記錄? –

+0

如果是這樣,你可以使用分頁這 –

+0

不,我只是有點擔心查詢不失敗或超時,但只是停止執行(這似乎不像正常行爲)。上面的代碼是專門爲測試這個問題編寫的。我實際上並不需要運行該查詢,但我需要知道爲什麼它在未來出現時無法運行。 – ChelseaB

回答

0

錯誤日誌是關鍵:

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.htmlunbuffered query with MySQLi?,http://php.net/manual/en/function.mysql-unbuffered-query.php

+1

是的,這是做到了。看起來查詢需要大約268MB。我剛剛編輯/etc/php/7.0/fpm/php.ini並增加了memory_limit。謝謝回答! – ChelseaB