Запуск WordPress в командной строке - отключить задержанный вывод?

8

Я создаю работу cron, которая работает за пределами WordPress. С точки зрения разработки, это действительно облегчает отладку и создание сценариев очистки или заданий cron, просто выполнив команду, подобную следующей в командной строке:

php myfile.php

Моя проблема заключается в том, что WordPress каким-то образом задерживает весь вывод ... обычно, когда вы запускаете такие файлы php, вывод генерируется на вашем экране в режиме реального времени.

Кто-нибудь знает, как предотвратить задержку WP всех выходных данных до конца задания? Вероятно, это какой-то простой параметр, который я пропускаю при запуске файла PHP, или какая-то константа, но я не уверен.

В следующем коде вы ожидаете задержку в 1 секунду между каждым выводом, вместо этого я в настоящее время получаю всю информацию, напечатанную в конце, сразу:

set_time_limit( 0 );
ini_set( "memory_limit", "64M" );

ob_start();
require_once( dirname( __FILE__ ) . '/wp-load.php' ); // you need to adjust this to your path
ob_end_clean();

global $wpdb;
$q = $wpdb->prepare ("SELECT * FROM wp_posts LIMIT 5");
$results = $wpdb->get_results ($q);
echo "found " . count ($results) . "\n";

foreach ($results as $post)
{
    echo $post->post_title . "\n";
    sleep(1);
}

echo "\n\ndone";
Алекс Кук
источник
Я считаю, что это связано с настройками на сервере, а не WordPress сам по себе. Протестировал ваш код, и он работает, как и предполагалось, на моем сервере при запуске из командной строки. Есть ли у вас плагины, которые могут кешироваться?
Кокарн
@ Кокарн, ты прав. Я должен был проверить это в другой установке WP. Похоже, это потому, что я использую W3 Total Cache. Опубликуем окончательное решение здесь (вместо того, чтобы просто деактивировать плагин).
Алекс Кук

Ответы:

10

После некоторого тестирования и WP Super Cache, и W3 Total Cache не освобождают буфер (или препятствуют его освобождению).

Отключить «задержку вывода» просто и зависит от используемого плагина кэширования.

WP Super Cache :

wp_cache_disable();
ob_end_flush(); // or ob_end_clean();

Это должно быть добавлено после включения wp-load.php, это останавливает любое кэширование мертвых в его дорожках и очищает буфер.

W3 Total Cache :

ob_end_clean(); // or ob_end_flush();

Как и выше, звоните после включения wp-load.php, аналогично тому, что у вас там; должен работать только с очисткой, W3 Total Cache запускает буфер, однако, по-видимому, он не предотвращает его очистку. Судя по тому, что ваш вывод все еще кэшируется и сбрасывание не работает, я бы сказал, что у вас WP Super Cache, который более агрессивен.

Убедитесь, что вы не запускаете новый буфер перед включением wp-load.php, иначе у вас будет буфер внутри буфера (bufferception?), И вам придется очищать его дважды или более.

soulseekah
источник
Спасибо - этот ответ особенно полезен для примера кода. Еще не успел проверить, но собираюсь проверить прямо сейчас.
Алекс Кук
Я использую W3 Total Cache. Похоже, что "wp_cache_disable" не является допустимой функцией - это специфично для Super Cache?
Алекс Кук
Да, wp_cache_disable()это особенность WP Super Cache. Я посмотрю на W3 Total Cache, чтобы увидеть, как его можно отключить аналогичным образом, используя ob_end_flushработал для меня. Каковы ваши настройки и версия W3 Total Cache?
soulseekah
Я отредактировал свой ответ.
soulseekah
Убедитесь, что вы не запускаете новый буфер, прежде чем включать wp-load.php, иначе у вас будет буфер внутри буфера.
soulseekah
4

Отключите все плагины, которые у вас могут быть, которые кэшируют всю страницу. WP-Super-Cache, W3 Total Cache и т. Д.

WordPress не «задерживает вывод». Но плагины кэширования всей страницы обычно делают. Это потому, что они пытаются получить этот вывод и сохранить его где-нибудь, для дальнейшего использования при обслуживании страницы. Таким образом, вывод страницы задерживается до конца, где плагин может его кешировать.

эфирное масло
источник
Аааа, хороший улов. Надо было подумать об этом! Я проверю и вернусь к вам. Спасибо.
Алекс Кук