问题描述

我正在使用自定义 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。