Menjalankan WordPress di Baris Perintah - Matikan Output Tertunda?

8

Saya membuat pekerjaan cron yang berjalan di luar WordPress. Dari perspektif pengembangan, ini membuatnya sangat mudah untuk debug dan membuat skrip pembersihan atau pekerjaan cron, dengan hanya menjalankan perintah seperti berikut pada baris perintah:

php myfile.php

Masalah saya adalah WordPress entah bagaimana menunda semua output ... biasanya ketika Anda menjalankan file php seperti ini output dihasilkan di layar Anda secara real time.

Apakah ada yang tahu bagaimana mencegah WP dari menunda semua output sampai akhir pekerjaan? Mungkin beberapa parameter sederhana yang saya lewatkan saat menjalankan file PHP, atau semacam konstanta, tapi saya tidak yakin.

Dalam kode berikut, Anda akan mengharapkan penundaan 1 detik antara setiap keluaran, sebagai gantinya, saya saat ini mendapatkan semua informasi yang dicetak di akhir, sekaligus:

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";
Alex Cook
sumber
Saya percaya itu ada hubungannya dengan pengaturan di server dan bukan wordpress itu sendiri. Menguji kode Anda dan berfungsi sebagaimana dimaksud pada server saya saat menjalankan dari baris perintah. Apakah Anda memiliki plugin yang mungkin di-cache?
Kokarn
@ Kim, kamu benar. Saya seharusnya menguji ini di instalasi WP lain. Sepertinya itu karena saya menggunakan W3 Total Cache. Akan memposting solusi akhirnya kembali ke sini (bukan hanya menonaktifkan plugin).
Alex Cook

Jawaban:

10

Setelah beberapa pengujian memang, baik WP Super Cache dan W3 Total Cache tidak melepaskan buffer (atau mencegah buffer dirilis).

Menonaktifkan "penundaan keluaran" sederhana dan tergantung pada plugin caching yang terlibat.

WP Super Cache :

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

Ini harus ditambahkan setelah memasukkan wp-load.php, ini menghentikan setiap caching mati di jalurnya dan mengguyur buffer.

W3 Total Cache :

ob_end_clean(); // or ob_end_flush();

Sama seperti di atas, panggilan setelah termasuk wp-load.php, mirip dengan apa yang Anda miliki di sana; harus bekerja dengan hanya pembilasan, W3 Total Cache memang mulai buffer, namun tampaknya tidak mencegah pembilasan itu sendiri. Dilihat dari cara output Anda masih di-cache dan pembilasan tidak bekerja, saya akan mengatakan Anda memiliki WP Super Cache, yang lebih agresif.

Pastikan Anda tidak memulai buffer baru sebelum memasukkan wp-load.php, jika tidak Anda akan memiliki buffer dalam buffer (bufferception?), Dan harus menyiram dua kali atau lebih.

soulseekah
sumber
Terima kasih - jawaban ini sangat membantu dengan contoh kode. Belum punya waktu untuk menguji tetapi akan memeriksa sekarang.
Alex Cook
Saya menggunakan W3 Total Cache. Sepertinya "wp_cache_disable" bukan fungsi yang valid - apakah itu khusus untuk Super Cache?
Alex Cook
Ya, wp_cache_disable()khusus untuk WP Super Cache. Saya akan melihat W3 Total Cache untuk melihat bagaimana itu dapat dinonaktifkan dengan cara yang sama, menggunakan ob_end_flushbekerja untuk saya. Apa pengaturan dan versi W3 Total Cache Anda?
soulseekah
Saya sudah mengedit jawaban saya.
soulseekah
Pastikan Anda tidak memulai buffer baru sebelum menyertakan wp-load.php, jika tidak Anda akan memiliki buffer di dalam buffer.
soulseekah
4

Nonaktifkan semua plugin yang mungkin Anda miliki yang melakukan caching seluruh halaman. WP-Super-Cache, W3 Total Cache, dll.

WordPress tidak "menunda output". Tapi biasanya plugin caching halaman penuh. Ini karena mereka mencoba untuk mendapatkan output itu dan menyimpannya di suatu tempat, untuk penggunaan selanjutnya dalam melayani halaman. Dengan demikian, output halaman tertunda sampai akhir, di mana plugin dapat menyimpannya.

Otto
sumber
Ahhh, tangkapan yang bagus. Seharusnya memikirkan itu! Saya akan menguji dan kembali kepada Anda. Terima kasih.
Alex Cook