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