問題描述
我正在使用自定義 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。