Haruskah saya menonaktifkan WP_CRON dan sebaliknya memicu wp-cron.php dari server setiap beberapa menit?

12

Sepertinya WordPress tidak perlu mem-boot WP CRON pada setiap pemuatan halaman. Saya berpikir, daripada menjalankannya pada setiap kunjungan, mengapa tidak menjadwalkannya untuk berjalan setiap 5 menit melalui server? Saya hanya bisa memicu wp-cron.php setiap lima menit dan mencapai hasil yang diinginkan?

Apakah ada kerugian untuk ini?

TheBigK
sumber

Jawaban:

15

Tidak ada kerugian untuk menjalankan WP CRON menggunakan pekerjaan cron server. Sebenarnya ini adalah latihan yang direkomendasikan.

Menurut Dokumen Pengembangan Plugin WordPress Resmi :

WP-Cron tidak berjalan terus-menerus, yang dapat menjadi masalah jika ada tugas penting yang harus berjalan tepat waktu. Ada solusi mudah untuk ini. Cukup mengatur penjadwal tugas sistem Anda untuk berjalan pada interval yang Anda inginkan (atau pada waktu tertentu yang diperlukan).

Untuk melakukan ini, Anda harus terlebih dahulu menonaktifkan perilaku cron default di wp-config.php:

define('DISABLE_WP_CRON', true);

Kemudian, jadwalkan wp-cron.phpdari server Anda. Untuk Linux, itu berarti:

crontab -e

Namun, alih-alih menjalankannya di Command Line (CLI), jalankan itu sebagai permintaan HTTP. Untuk itu Anda dapat menggunakan wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress memuat semua file inti, plugin, dll yang diperlukan wp-cron.phpdengan KODE berikut:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Jadi jangan khawatir tentang WordPress yang tidak memuat fitur-fitur penting.

Fayaz
sumber
1
Dokumentasi WordPress.org yang Anda tautkan dengan menyebutkan wget http://YOUR_SITE_URL/wp-cron.phptanpa penambahan ?doing_wp_cron Jadi apakah yang satu lebih baik dari yang lain? Apa penambahan selain ?doing_wp_cronyang bukan versi bukan?
Garconis
Mungkin saja log Anda akan menampilkan string kueri sehingga Anda tahu bagaimana itu disebut dengan pasti.
Slbox
1
Saya tidak setuju dengan ini sama sekali. Pertama-tama, itu tidak benar bahwa itu "direkomendasikan". Kedua, metode ini akan melumpuhkan semua plugin yang menggunakan metode penjadwalan yang direkomendasikan. Saya pikir ini saran yang sangat buruk. Hampir tidak ada yang harus mematikan cron kecuali Anda memiliki alasan yang SANGAT spesifik untuk melakukannya. Satu-satunya alasan yang bisa saya pikirkan adalah jika Anda melanggar WordPress untuk CDN atau sesuatu. Ini BUKAN praktik normal.
John Dee
1
@JohnDee: metode ini tidak benar-benar menonaktifkan cron, ini menonaktifkan metode WP Cron yang memeriksa dan mencoba menjalankan pekerjaan cron pada setiap pemuatan halaman. define('DISABLE_WP_CRON', true);menonaktifkan hanya bagian dari proses cron dan kemudian memanggil skrip cron dengan kode seperti: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_crondi server memastikan pekerjaan cron dieksekusi. Plugin penjadwalan apa pun tidak akan tahu bedanya.
Fayaz
1
Tautan dokumentasi WordPress.org tentang subjek ini berubah menjadi developer.wordpress.org/plugins/cron/…
aldemarcalazans
2

Ada beberapa kelemahan: Pertama, ketika menggunakan wp-cron.php sebagai cli hal-hal seperti $ _SERVER variabel tidak disetel. Orang-orang mengatasi keterbatasan ini dengan menggunakan permintaan curl ke wp-cron.php.

Kedua, Karena WP itu sendiri tidak dimuat dengan wp-cron.php; jika Anda menggunakan plugin SMTP mailer maka ini tidak akan dimuat saat memanggil wp-cron. Sekali lagi, menggunakan panggilan ikal mengatasi masalah ini. Curl tampaknya menjadi metode yang paling sering digunakan.

Namun; Saya lebih suka menggunakan wp-cli setelah mengatur pengaturan mail di postfix dan (untuk nginx) konfigurasi php-fpm dengan benar dan mengatur crontab seperti

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Sebutkan semua crons dengan bidang khusus dalam format csv - kait menjadi nama cron, jalankan relatif berikutnya adalah waktunya. Hapus yang menunjukkan 'sekarang' sebagai run berikutnya (yang seharusnya sekarang) menggunakan AWK, berikan daftar itu ke xargs ke panggil wp cron event run $HOOKsetiap cron.) Menggunakan wp-cli memuat WordPress dengan benar (saya memilih untuk melompati plugin ketika mendaftar crons, karena kode erros dan peringatan php akan mengacaukan hasil skrip; tetapi tidak untuk melompati mereka ketika menjalankan cron dengan xargs, seperti cron mungkin membutuhkan plugins yang sedang dimuat)

Semoga ini memberi Anda beberapa petunjuk tentang apa yang harus diwaspadai.

TechnicalChaos
sumber
2
Bagaimana dengan pengaturan: / 15 * * * wget -q -O - yourdomain.com/wp-cron.php?doing_wp_cron seperti yang disarankan oleh TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Tampaknya melakukan pekerjaan dengan baik. Sangat menghargai komentar Anda.
TheBigK
Ya seperti yang saya sebutkan di seluruh orang memilih untuk menggunakan curl (wget atau panggilan http lainnya) untuk memicu crons, dan tidak ada yang salah dengan metode itu. Saya baru saja menyarankan masalah memanggil file php wp-cron secara langsung, yang tidak akan menyertakan file yang diperlukan, dan menyarankan metode alternatif lain jika Anda ingin sedikit memperbaikinya.
TechnicalChaos
0

Ada banyak alasan untuk tidak menonaktifkan wp-cron. Bahkan, hampir tidak mungkin menemukan use case untuk melakukan ini. Itu tidak memperlambat situs Anda, dan digunakan untuk hal-hal yang mungkin tidak Anda sadari.

Banyak plugin menggunakan WP-Cron untuk menjadwalkan sesuatu. Mereka mungkin menjadi bingung jika Anda mematikan penjadwal.

Ada banyak tutorial tentang hal ini karena membingungkan, dan karena tidak banyak berpengaruh pada situs Anda ketika Anda menonaktifkannya. Apa yang akan dilakukannya, adalah menyebabkan sakit kepala pada dev yang harus memperbaiki masalah misterius yang diciptakannya dalam enam bulan.

Juga, WP Heartbeat menyala setiap 15 detik di area admin, menyelesaikan masalah ini untuk 99% orang yang berpikir mereka memilikinya.

John Dee
sumber
2
Ini adalah respons yang mengerikan - mereka -NOT- menonaktifkan WP Cron. Mereka hanya menonaktifkan permintaan WP Cron pada pageload, dan sebaliknya memindahkannya ke daemon cron sistem. Sheesh.
Barry Chapman
Bagaimanapun, alasan utama untuk membiarkannya sendiri adalah bahwa banyak plugin sekarang menggunakan cron untuk menjalankan tugas latar belakang yang diperluas. Anda dapat mengacaukan sesuatu yang dilakukan orang BERIKUTNYA, karena mereka mengharapkan sistem bekerja dengan cara standar. Semoga berhasil!
John Dee
jika plugin dikodekan dengan cara yang benar-benar rusak jika wp cron dinonaktifkan, maka itu berarti telah diprogram oleh orang yang tidak kompeten, dan lebih baik segera menghapusnya.
Magnetic_dud
Nah, dua komentar di sini membuktikan maksud saya. Anda memiliki satu dev yang mengatakan "ini tidak menonaktifkan cron, ini seharusnya mengocoknya ke OS cron" - yang merupakan break di WordPress, yang merupakan OS netral. Kemudian dev lain berkata "hei, itu tanggung jawab plugin dev untuk merencanakan pemusnahan wp cron." Uh, baiklah. Jadi jika Anda ingin fungsionalitas cron, Anda harus RENCANA untuk menghilangkan sistem cron? Untuk apa? Sistem cron cadangan? Komentar itu tidak masuk akal [jelas].
John Dee
Bagaimanapun, kondisi saat ini adalah "TOTAL CONFUSION". Itu keadaan saat ini. Satu-satunya solusi, dari POV kerangka, adalah memberi tahu orang-orang: ADA ALASAN WP-CRON SYSTEM ADA. JANGAN MATIKAN. Pilihan lainnya adalah 10.000 berbeda, berbagai pendapat. Itulah yang kita miliki sekarang.
John Dee
0

Saya belum menemukan kelemahan nyata dari pembongkaran wp-cron ke layanan eksternal. Sedang melakukan ini selama bertahun-tahun sekarang.

Terutama di dunia saat ini di mana Anda dapat menjalankan aplikasi sebagai layanan microser.

Saya menggunakan wadah Docker terpisah untuk setiap komponen WordPress - php, web, db, crontab, redis, dan sebagainya). Memiliki crontab sebagai wadah terpisah, memanggil wp-cron melalui http menggunakan jaringan lokal, hanya berjalan ketika saya membutuhkannya.

Ini mengurangi tekanan pada node backend dan meningkatkan keamanan dengan memiliki permukaan serangan yang lebih kecil.

Jika pengembang tidak dapat menemukan cara untuk melakukan hal-hal tanpa harus memanggil wp-cron pada setiap halaman memuat, huh, ini hanya berbicara untuk pengalaman kurang atas namanya. "Membiarkannya sendiri", karena kamu tidak mengerti bagaimana segala sesuatunya bekerja bukanlah alasan yang baik untuk menyimpannya.

Radoslav Stefanov
sumber