Не способный экспортировать большой нет. из сообщений в csv

У меня есть пользовательский тип сообщения product как wp электронная коммерция.

Существуют сообщения 30k в нем. Также имейте, связывают пользовательскую таксономию. В основном пытаюсь экспортировать те сообщения в csv, но query_posts с таким количеством записей дает мне проблему...

Какие-либо подсказки???

0
22.07.2011, 16:20
3 ответа

Механизм запроса WordPress перетаскивает полный набор результатов в память, таким образом, они не подходят для таких больших блоков информации.

Можно использовать numberposts и offset в get_posts() разделять процесс на блоки. Я не уверен, сможете ли Вы сделать это в единственном выполнении даже затем, таким образом, Вы, возможно, должны были бы сохранить, сколько блоков Вы обработали, и запустите оттуда в следующий раз.

1
19.02.2020, 23:52
  • 1
    Точно, что я думаю, но снова поскольку я спросил, как будет я знать, сколько общее количество разделяет на блоки для обработки.. т.е. как я стал бы общим нет. из сообщений... –  Rajeev Vyas 22.07.2011, 16:51
  • 2
    @Rajeev Vyas, почему подсчет беспокойства? Я просто сделал бы это до get_posts() возвраты ничто, означая, что у Вас заканчиваются сообщения. –  Rarst 22.07.2011, 16:56

Я недавно должен был сделать экспорт для блога с сообщениями 34K и комментариями 75K. Я смог заставить это работать путем изменения WordPress Усовершенствованный плагин Экспорта и увеличения max_execution_time в php.ini от 30 секунд приблизительно до 5 минут.

Плагин захватывает снимок всех идентификаторов сообщения в дб, затем выполняет пакеты в 20 инкрементах сообщения и циклах назад до до его сделанного. Я изменил инкременты на 40, который ускорил его и позволил ему завершаться за разумное количество времени.

Вот пример того, как запрос выполняется:

Пункт $where ниже еще определяется длинным списком если условные выражения на основе сменных опций.

$post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");

$pass = 0;
$passes = 1000 + count($categories);
while ( ( $cat = array_shift($categories) ) && ++$pass < $passes ) {
    if ( $cat->parent == 0 || isset($cats[$cat->parent]) ) {
        $cats[$cat->term_id] = $cat;
    } else {
        $categories[] = $cat;
    }
}
unset($categories);


<?php if ($post_ids) {
        global $wp_query;
        $wp_query->in_the_loop = true;  // Fake being in the loop.
        // fetch 20 posts at a time rather than loading the entire table into memory
        while ( $next_posts = array_splice($post_ids, 0, 20) ) {
            $where = "WHERE ID IN (".join(',', $next_posts).")";
            $posts = $wpdb->get_results("SELECT * FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
                foreach ($posts as $post) {
                    setup_postdata($post); ?>
1
19.02.2020, 23:52
  • 1
    get_col не будет работать, если будут записи 30k в том запросе.... get_col, внутренне использует для цикла, который будет, ни работать в течение 30k времени (нет. из времени выполняется цикл, ограничен в apache/php).. –  Rajeev Vyas 23.07.2011, 15:14
  • 2
    необходимо повысить макс. время выполнения в php. Мы выполняем этот экспорт каждую неделю. –  Chris_O 24.07.2011, 00:53

Вы могли сделать запрос к месяцу или году для сокращения количества сообщений. Затем у Вас было бы несколько меньших .csv, которые можно объединить вместе.

Кроме того, можно попытаться экспортировать в .csv непосредственно от DB в phpMyAdmin.

0
19.02.2020, 23:52
  • 1
    phpMyAdmin не будет полезен, это на самом деле продукты и не сообщение, таким образом, никакой ежемесячный архив не будет логичен... Я пытаюсь теперь дать опцию экспортировать в блоках тысячи... может я становиться общим нет. сообщения для какого-либо пользовательского типа сообщения?? таким образом, я могу, разделил их на блоки тысячи.... –  Rajeev Vyas 22.07.2011, 16:28
  • 2
    "экспорт […] в phpMyAdmin" phpMyAdmin также связывается с пределами времени выполнения для Сценариев PHP; если это все еще не работает, можно использовать mysqldump от консоли. например. mysqldump --host=DB_HOST -u DB_USER -p --databases DB_NAME --tables TABLE_NAME | gzip -9 > dump-дата + %Y-% m-% d _ % Hh%Mm%Ss.sql.gz @Rajeev Vyas "phpMyAdmin не будет полезен, это на самом деле продукты", что делает, которые имеют к с phpMyAdmin — можно экспортировать любую таблицу или набор данных, Вы хотите … –  feeela 22.07.2011, 16:32
  • 3
    @feeela phpMyAdmin, не будет полезный bcoz, пытаюсь обеспечить, интерфейс для администратора (не технический), чтобы экспортировать продукты, связывающие пользовательский taxonomies и хотеть csv в определенном формате не только, выводят таблицу. например, хочу только, чтобы заголовок продукта и состояние (пользовательская таксономия) экспортировали... –  Rajeev Vyas 22.07.2011, 16:38

Теги

Похожие вопросы