問題描述

我正在使用自定義 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 不適合從數據庫中獲取大量數據。為什麼?在你的情況下:

  1. $wpdb->get_results( ... ) – 一次將所有結果記錄到 RAM 中。這意味着如果你有 4mb,10mb 或 50mb 的數據,那麼所有內容都將被存儲在內存中 (你所知道的是什麼) 。

  2. $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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。