Intereting Posts
посты по названию второе слово фильтрация на_состоянии перестала работать, когда я обновился до WP 3.6.1 Как передать пароли пользователей с одного сайта WordPress на другой? Не удается обновить WordPress, необходимо перезагрузить VPS Как показывать рекламу google между почтовым контентом? Сохранение пользовательского поля в окне приложения в WordPress 3.5 Dashboard – получить статус и положение обменных ящиков и передать их методу ajax Возможность использования встроенной локализации WordPress Все запланированные должности WordPress публикуются немедленно Добавить контейнер в подменю nav_menu Использование get_template_part для получения файла шаблона на основе текущего типа сообщения Контактная форма 7 в пользовательском файле php Какая хорошая стратегия для локализации публикации WordPress и содержимого страницы? Необходимость выполнения задания cron Изменение загруженного изображения с помощью 'wp_get_image_editor' и 'wp_handle_upload_prefilter'

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 все отлично работает.

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

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

$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 ); }