2012-04-02 43 views
1

我使用簡單的PHP查詢從數據庫中獲取行,表中有7000行以上,每當我獲取所有行時,PHP不工作和腳本死亡,但是當我將結果限制爲6400時,一切正常。 我應該知道MySQL或PHP有任何限制嗎?如果有的話,我需要配置這些設置。 任何幫助是高度讚賞。 請注意,我的PHP設置允許腳本執行時間爲1800秒,內存使用率設置爲512MB。PHP/MySQL如果行數大於6400不會返回任何結果

+3

*如何*它死?任何錯誤消息?你檢查過日誌嗎? – deceze 2012-04-02 06:39:44

+1

腳本在死前運行了多久?你是否嘗試像'php -f/path/the_script.php'那樣在命令上運行腳本並查看是否可以檢測到某些內容?你可以在處理/顯示它們之前打印返回的行數,以查看問題是數據庫還是php/webserver? – Yaniro 2012-04-02 06:42:40

+0

當我使用查詢:「SELECT * FROM table」它只是顯示空的空白頁面,但是當我使用「SELECT * FROM table LIMIT 6400」時,它會打印行,因爲它使用error_reporting(E_ALL)和ini_set ('display_errors',1),根本沒有顯示錯誤,只是死在空白頁面。它曾經工作時表中少於6490行,但不再。我擔心這可能是一些服務器設置,我不知道。 – zokibtmkd 2012-04-02 06:46:46

回答

2

爲什麼你需要那麼多行?我很確定php會因爲內存不足而死亡。

在控制檯中運行您的查詢,查看是否有超過7000行沒有問題。如果它返回所有那裏,你可以肯定它是PHP,而不是你的數據庫,我相信它是PHP。

無論你做什麼,最好是循環數據,也就是所謂的「分頁」,並將其讀入例如100行的數據塊並對其進行處理,0-100,100-200,200-300 ...

+0

就是這樣,內部存儲器設置爲32M,我將其設置爲256M,現在可以工作。謝謝你的努力 – zokibtmkd 2012-04-02 09:06:09

1

你有2個解決方案,因爲我看到它:

1)一個@burzum建議。真的很好,雖然你必須根據你的服務器負載(如果它不是恆定的)根據經驗確定最大大小。

2)使用mysql_unbuffered_query()

mysql_unbuffered_query確實有一些缺點,因爲描述:

mysql_unbuffered_query()的好處是有代價的:你不能從mysql_unbuffered_query()返回的結果集使用mysql_num_rows()mysql_data_seek(),直到所有行都被提取。您還必須從未緩衝的SQL查詢中獲取所有結果行,然後才能使用相同的link_identifier向MySQL發送新的SQL查詢。

但因爲你正在處理大數據集,似乎有充分理由...