Intereting Posts
Как использовать языковые файлы в плагинах? Удаление пула CPT из URL-адреса, но поддержка блогов / новостей для обычных сообщений? apply_filters в $ GLOBALS Использование оператора switch в WordPress Пользовательская переписывающая ссылка не работает Как спрятать CPT-файлы из медиа-библиотеки Маленькое введение перед последними сообщениями в блоге Эта веб-страница имеет проблему с перенаправлением Странное поведение get_the_ * с php 5.4 WordPress Network (multisite) – как обеспечить, чтобы каждый сайт имел свой собственный URL-адрес администратора? Вызывать изображение из сообщения на индексной странице? Получить последний элемент из wpdb в виде строки Проблема с получением ссылки по умолчанию типа post, как и пользовательские типы orther Панель администратора – отключить перемещение выбранных терминов в начало Metabox Как создать архив для всех сообщений, у которых нет почтового формата?

get_results на больших наборах данных

Я экспериментирую с очень тревожной проблемой, используя специальный SQL-запрос. У меня есть пользовательская таблица MySQL, называемая trading_datas имеющая 165 строк для 4,4Mo. Одно полевые datas моей таблицы – большой сериализованный массив.

Прося об этом так:

 $querystr = "SELECT item, datas FROM trading_datas"; $result = $wpdb->get_results( $querystr, 'ARRAY_A' ); 

мой PHP-скрипт останавливается, и после этой строки ничего не происходит. При извлечении только item все отлично работает.

Должен ли я закрепить мой сериализованный массив перед тем, как поместить его в базу данных? Любое другое решение?

Большое спасибо за помощь!

Solutions Collecting From Web of "get_results на больших наборах данных"

$wpdb не подходит для сбора огромного количества данных из базы данных. Зачем? В твоем случае:

  1. $wpdb->get_results( ... ) – извлекает все результаты в вашу RAM сразу. Это означает, что если у вас есть 4 МБ, 10 МБ или 50 МБ данных в БД, все будет сохранено в памяти (что ограничено, как ты знаешь).
  2. $wpdb->get_results( ..., ARRAY_A )$wpdb извлекает все как объект по умолчанию, а затем, если вы передадите ARRAY_A , он преобразует массив объектов в массив связанных массивов. Это означает, что если вы уже 50mb в память 4 50mb / 10 50mb / 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 ); }