問題描述
我正在使用自定義 SQL 查詢嘗試一些非常令人不安的問題。我有一個名為 trading_datas 的自定義 MySQL 表,具有 165 線,用於 4,4Mo 。我的表的一個欄位 datas 是一個大的序列化陣列。
當以這種方式請求時:
$querystr = "SELECT item, datas FROM trading_datas";
$result = $wpdb->get_results( $querystr, 'ARRAY_A' );
我的 PHP 指令碼停止,沒有任何東西在該行之後被回顯。當檢索 item 時,一切都很好。
在將陣列放入資料庫之前,我應該將其序列化的陣列壓縮嗎?任何其他解決方案?
非常感謝您的幫助!
最佳解決方案
$wpdb 不適合從資料庫中獲取大量資料。為什麼?在你的情況下:
-
$wpdb->get_results( ... )– 一次將所有結果記錄到 RAM 中。這意味著如果你有 4mb,10mb 或 50mb 的資料,那麼所有內容都將被儲存在記憶體中 (你所知道的是什麼) 。 -
$wpdb->get_results( ..., ARRAY_A )–$wpdb預設將所有內容作為物件,如果透過ARRAY_A,它將將物件陣列轉換為相關陣列的陣列。這意味著如果您已經將4mb/10mb/50mb資料提取到記憶體中,則必須將其乘以 2 或更多次。
所以,我想你的問題是你的指令碼達到記憶體限制。這就是為什麼它適用於一個結果,並不適用於所有的結果。這個問題有一個解決方法 – 以您需要的方式使用 mysql_*功能:
$result = @mysql_query( "SELECT item, datas FROM trading_datas", $wpdb->dbh );
if ( $result ) {
while ( ( $row = @mysql_fetch_array( $result, MYSQL_ASSOC ) ) ) {
// do stuff here for each result ...
}
@mysql_free_result( $result );
}
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。