WP-Cron (wp-cron.php): devre dışı bırakma ve sistem cron ayarı | WordPress performans optimizasyonu

WordPress'te Cron görevleri, belirli bir saat veya tarihe planlanmış görevleri otomatik olarak çalıştıran özelliktir. Bu görevler wp-cron.php dosyası üzerinden çalışır; WordPress her sayfa yüklendiğinde bu dosyayı çağırarak planlanmış görevleri işler. Bu yöntem basittir ama trafiği yüksek sitelerde performansı düşürebilir.
Ⅰ. WP-Cron'un çalışma süreci ve performans sorunları
WordPress, Linux sunucuların geleneksel Cron sistemi yerine kendi Cron özelliği olan WP-Cron'u sunar. WP-Cron, wp-cron.php dosyası üzerinden çalışır: ⓐ kullanıcı siteyi her ziyaret ettiğinde planlanmış görev olup olmadığını kontrol edip çalıştırır, ⓑ Rank Math ve WP Rocket gibi eklentiler kendi planlanmış periyodik görevlerini çalıştırır.
Buna karşılık trafiği yüksek sitelerde wp-cron.php gereğinden fazla sık çağrılarak sunucuya aşırı yük bindirebilir. Özellikle çok sayıda kullanıcı aynı anda bağlandığında yinelenen cron görevleri çalışır ve bu da CPU kullanımında artış, yanıt gecikmesi, sayfa yüklenmesinde yavaşlama gibi sorunlara yol açabilir.
WP-Cron'un bu yapısal sınırları WordPress performansını düşürebilir; özellikle yüksek performans gerektiren siteler, online mağazalar ve haber portalları gibi yerlerde ciddi darboğazlara neden olabilir.
🔄 WP-Cron'un çalışma şekli ve yapısı
Ⅱ. WordPress performans optimizasyonu
WordPress performansını optimize etmenin birçok yolu vardır. Önbellek, ön yüz ve veritabanı optimizasyonundan sonra WP-Cron ayarlarıyla daha da iyileştirme yapabilirsiniz.
Her WordPress sayfası yüklendiğinde planlanmış olaylar kontrol edilir; eklentilerin periyodik görevleri yüzünden verimsiz WP-Cron'un daha verimli kullanılması gerekir.
1️⃣ WP-Cron testi
Cron görevlerini WP-CLI ile kontrol ettiğinizde etkin Cron olaylarının çalıştığını görürsünüz. Rank Math ve WP Rocket gibi eklentilerin planlanmış görevleri günlük ya da birkaç dakikada bir çalıştırdığı görülür.

2️⃣ WP-Cron ayarlama
WP-Cron, WordPress'in planlanmış görevlerini işleyen sanal bir zamanlayıcıdır; kullanıcı ziyaret ettiğinde wp-cron.php çalışır. Ancak trafiğe bağlı çalışma güvenilir değildir ve aşırı çağrılar sunucuya yük bindirebilir; bu yüzden genellikle bir sistem cron'u ile desteklenir.
Gerekirse wp-config.php'de DISABLE_WP_CRON ayarlayarak WP-Cron'u kapatıp Linux cron ile düzenli çalıştırmak önerilen yöntemdir.
|
Öğe |
WP-Cron'u devre dışı bırakma + yalnızca sistem cron'u |
|---|---|
|
Ayarlar |
WP-Cron'u kapatıp wp-cron.php'yi sistem cron'undan çalıştırma |
|
Artıları |
Yinelenen çalışma olmaz, saate dayalı kesin çalışma ve düşük sunucu yükü |
|
Eksileri |
Bazı eklenti özellikleri durabilir ve ayar hatasında görev kaçırma riski vardır |
|
Önerilen · Durum |
Trafiği ve planlanmış görevi çok olan sitelere uygun |
Ancak ① yönteminin bir dezavantajı var: WP Rocket gibi önbellek eklentilerinin ziyaretçiler gelmeden önce her dakika önbelleği önceden oluşturan ön yükleme özelliği devre dışı kalır.
⚙️ wp-config.php dosyasını düzenleme
WP_CRON'u devre dışı bırakarak ayarlayabilirsiniz.
# WP_CRON'u devre dışı bırak
define( 'DISABLE_WP_CRON', true );WP_CRON_LOCK_TIMEOUT, WP-Cron çalışırken diğer çalıştırma denemelerini engelleyen bir [zamana dayalı kilit] işlevi görür.
# 5 dakika = 300, her 60 dakika = 3600
define('WP_CRON_LOCK_TIMEOUT', 300);Bu nedenlerle wp-config.php dosyasında yalnızca WP-Cron'u devre dışı bırakmak yerine, devre dışı bıraktıktan sonra bir System Cron görevi eklemenizi öneririm; şu anda yönettiğim sunucu da bu şekilde ayarlı.
⚙️ Linux sunucuda sistem cron'unu etkinleştirme [temel]
Alan adı başına etkinleştirebilirsiniz.
# Her 5 dakikada çalıştır
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Her 30 dakikada çalıştır
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Her saat çalıştır
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Günde 1 kez çalıştır
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1Yukarıdaki dört satır crontab'a eklenen aralık örnekleridir; belirlenen her saatte curl [wp-cron.php] adresini çağırır, böylece ziyaretçi olmasa da planlanmış görevler çalışır.
# Sunucu yerel sunucuysa
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Her 30 dakikada çalıştır
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Her saat çalıştır
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Günde 1 kez çalıştır
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1WP-CLI kuruluysa istediğiniz aralık için tek satır ayarlayabilirsiniz. ▼
# Her 5 dakikada çalıştır
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Her 30 dakikada çalıştır
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Her saat çalıştır
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Günde 1 kez çalıştır
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietBu ayarla WP-CLI sunucu içinde [--due-now] seçeneğiyle yalnızca zamanı gelmiş planlanmış görevleri çalıştırır; [flock -n] ise önceki çalışma bitmediyse yenisini atlar.
⚙️ WP-CLI ve 1 dakikalık sistem cron'u, yinelenen cron görevlerini önleme
Varsayılan WP_CRON, iş yükü fazla olduğunda görevleri yok sayar (atlar) ve sonra yeniden çalıştırır. Varsayılan WP-Cron'u kapatıp planlanmış görevlerin 5 dakikalık kilit tutmasını sağlayarak sistem cron'u ile WP-Cron'un aynı anda çalışmasını önleyin.
define('DISABLE_WP_CRON', true); // WP-Cron otomatik çalışmasını kapatır
define('WP_CRON_LOCK_TIMEOUT', 300); // bekleme yok → atlanır; planlanmış görev çalışırken 5 dakikalık kilit tutulur
/* That's all, stop editing! Happy publishing. */Sistem cron'una flock -n seçeneğini ekleyerek sistem cron'u tarafında kilidi gören çalışmanın hemen sonlanmasını sağlayın.
# wp cron ayarı: flock -n → bekleme yok → hemen çık
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietBu ayarların birleşiminin sonucu:
- WP'nin dahili otomatik çalışması kapalı → planlanmış görevler ziyaretçi sayısından bağımsız çalışır
- Sistem cron'u her dakika çalışmayı dener → planlanmış görev varsa çalışır
- Kilit konunca 5 dakika boyunca yeniden çalışmaz → yinelenen çalışmayı önler (aslında flock -n ayarıyla WP_CRON_LOCK_TIMEOUT'a pek gerek yoktur.)
Yinelenen çalışma önlemesiyle gerçek akış:
- 08:00 → sistem cron'u wp-cron.php'yi çağırır
- Planlanmış görev A çalışır → 5 dakikalık kilit konur
- 08:01 → sistem cron'u yeniden çağırır
- Görev A kilitli → çalışmaz
- 08:02–08:04 → aynı
- 08:05 → kilit kalkar → sıradaki planlanmış görev varsa çalışır
WP görevleri otomatik çalıştırmak yerine sistemin çalıştırmayı üstlenmesidir. Ve WP_CRON_LOCK_TIMEOUT yinelenen çalışmaya karşı yedek bir güvenlik önlemi olarak çalışır.
|
Öğe |
WP_CRON_LOCK_TIMEOUT |
flock -n |
|---|---|---|
|
Kilit türü |
WordPress içinde |
Sistem düzeyi |
|
Kilidin yeri |
Veritabanı tabanlı: wp_options'taki doing_cron |
Sistem dosyası tabanlı: ~/.wp_cron.lock |
|
Bekler mi? |
❌ Beklemez → atlar |
❌ Beklemez → hemen çıkar |
|
Yinelenen çalışmayı önleme |
✅ Yinelenen çalışmayı önler |
✅ Yinelenen çalışmayı önler |
İş bitince WP-CLI komutuyla cron'un eskisi gibi çalışıp çalışmadığını kontrol edebilirsiniz.
wp cron event list+-------------------------------------------+---------------------+-----------------------+---------------+
| hook | next_run_gmt | next_run_relative | recurrence |
+-------------------------------------------+---------------------+-----------------------+---------------+
| rocket_saas_pending_jobs | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue_rucss | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_saas_on_submit_jobs | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_preload_process_pending | 2026-10-17 12:00:59 | now | 1 minute |
| rocket_purge_time_event | 2026-10-17 12:16:59 | 15 minutes 8 seconds | 1 hour |
| wp_privacy_delete_old_export_files | 2026-10-17 12:28:46 | 26 minutes 55 seconds | 1 hour |
| wp_update_user_counts | 2026-10-17 20:15:52 | 8 hours 14 minutes | 12 hours |
| rocket_preload_revert_old_failed_rows | 2026-10-17 20:17:59 | 8 hours 16 minutes | 12 hours |
| wp_version_check | 2026-10-17 20:28:34 | 8 hours 26 minutes | 12 hours |
| wp_update_plugins | 2026-10-17 20:58:34 | 8 hours 56 minutes | 12 hours |
| wp_update_themes | 2026-10-17 21:28:34 | 9 hours 26 minutes | 12 hours |
| recovery_mode_clean_expired_keys | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_privacy_personal_data_cleanup_requests | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_scheduled_delete | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| delete_expired_transients | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| wp_scheduled_auto_draft_delete | 2026-10-18 08:15:54 | 20 hours 14 minutes | 1 day |
| wp_delete_temp_updater_backups | 2026-10-18 08:16:17 | 20 hours 14 minutes | 1 week |
| rocket_update_dynamic_lists | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_saas_clean_rows_time_event | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_performance_hints_cleanup | 2026-10-18 08:16:58 | 20 hours 15 minutes | 1 day |
| rocket_preload_clean_rows_time_event | 2026-10-18 08:26:57 | 20 hours 25 minutes | 1 week |
| rocket_database_optimization_time_event | 2026-10-18 09:34:25 | 21 hours 32 minutes | 1 day |
| wp_site_health_scheduled_check | 2026-10-19 07:28:46 | 1 day 19 hours | 1 week |
| rocket_remove_saas_failed_jobs | 2026-10-19 08:16:58 | 1 day 20 hours | 3 days |
+-------------------------------------------+---------------------+-----------------------+---------------+Çıktıda kayıtlı kanca adları, sonraki çalışma zamanı ve tekrar aralığı görünür; [next_run_relative] sütunu [now] olan görevler bir sonraki cron çalışmasında hemen işlenir.
Ⅲ. WP-Cron planlanmış görevleri çalışmadığında
Planlanan saat gelince görevin kendiliğinden çalışacağını düşünmek kolaydır ama WP-Cron yapılacak işi belirli bir saatte değil, sayfa isteği geldiğinde kontrol eder. Saat 14.00'e planlanan görev, o zamana kadar istek gelmezse 17.00'deki ilk istekte çalışır.
Çalışmalar gecikince planlanmış yazılar yazı listesinde [Zamanlama kaçırıldı] olarak görünür. [Araçlar › Site sağlığı] Durum sekmesindeki [Önerilen iyileştirmeler] altında [Zamanlanmış bir olay başarısız oldu] belirir. Önbellek ön yüklemesi gibi eklentilerin kaydettiği görevler de aynı nedenle beklemede kalır.
Planlanmış görevler sayfa isteği, yapılacak iş kontrolü ve geri döngü isteğinden geçip [wp-cron.php]'de çalışır; bunlardan biri koparsa saat geçse de çalışmaz.
1️⃣ Ziyaret olmadığında ya da sayfa önbelleği yanıt verdiğinde
WP-Cron yapılacak işi yalnızca WordPress'i çalıştıran isteklerde kontrol eder; bu yüzden ziyaret olmayan saatlerde saati geçmiş görevler birikir. Ziyaret olsa bile yanıt sayfa önbelleği dosyasından gelirse WordPress çalışmadığından sonuç aynıdır.
WP Rocket sayfa önbelleği açık bir WordPress'te önbelleğe alınmış ana sayfa açıldığında [wp-cron.php] çağrısı kaydedilmedi. Önbelleğe alınmamış bir adres açılınca aynı saniyede çağrı kaydedildi ve gecikmiş beş görev çalıştı.
Gecikmiş görevleri WP-CLI listesinde [next_run_relative] değeri [now] olan satırları süzerek kontrol edebilirsiniz.
wp cron event list --next_run_relative=now --fields=hook,next_run_gmt,next_run_relative+----------------------------------+---------------------+-------------------+
| hook | next_run_gmt | next_run_relative |
+----------------------------------+---------------------+-------------------+
| rocket_saas_pending_jobs | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue_rucss | 2026-10-17 14:49:58 | now |
| rocket_saas_on_submit_jobs | 2026-10-17 14:49:58 | now |
| rocket_preload_process_pending | 2026-10-17 14:49:59 | now |
+----------------------------------+---------------------+-------------------+[now], planlanan saatin geçtiği anlamına gelir. Bu liste komutu da WordPress'i yüklediğinden gecikmiş görev varsa biter bitmez [wp-cron.php]'yi çağırır. Aynı komutu hemen yeniden çalıştırırsanız az önce gördüğünüz görevler listeden kalkmış olur.
Nedeni düzeltmeden önce gecikmiş görevleri halletmek istiyorsanız WP-CLI ile yalnızca süresi geçmiş görevleri hemen çalıştırın.
wp cron event run --due-nowExecuted the cron event 'rocket_saas_pending_jobs' in 0.005s.
Executed the cron event 'action_scheduler_run_queue' in 0.006s.
Executed the cron event 'action_scheduler_run_queue_rucss' in 0.006s.
Executed the cron event 'rocket_saas_on_submit_jobs' in 0.005s.
Executed the cron event 'rocket_preload_process_pending' in 0.007s.
Success: Executed a total of 5 cron events.Bu komut görevleri HTTP isteği olmadan sunucu içinde çalıştırır; ziyaretten bağımsız belirli aralıklarla işlemek için aynı komutu sistem cron'una kaydedin.
2️⃣ Yalnızca DISABLE_WP_CRON açık ve sistem cron'u yokken
[DISABLE_WP_CRON] true olunca sayfa isteği gelse de WP-Cron yapılacak işi kontrol etmez. Resmî belgeler de önce sistem görev zamanlayıcısına kaydetmeyi, sonra bu sabiti eklemeyi söyler; kayıt olmadan yalnızca sabit eklenirse planlanmış görevleri çalıştıran bir şey kalmaz.
Sabit eklenmişken bir dakika kadar sonrasına planlanan yazı saat geçtiği hâlde [Zamanlanmış] olarak kaldı ve yazı listesinin tarih sütununda [Zamanlama kaçırıldı] göründü. Bu sürede tek bir [wp-cron.php] çağrısı bile kaydedilmedi.
Sabitin açık olup olmadığını [wp cron test] ile kontrol edebilirsiniz.
wp cron testError: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.Bu hata çıkarsa sistem cron'unda [wp-cron.php]'yi çağıran ya da [wp cron event run] çalıştıran bir satır olup olmadığını kontrol edin. Site hesabının crontab'ı boşsa aşağıdaki gibi görünür.
crontab -lno crontab for exampleBöyle bir satır yoksa sistem cron'u kaydedin; ortamınız buna izin vermiyorsa [DISABLE_WP_CRON] satırını silip WP-Cron'u yeniden kullanın.
3️⃣ Sunucunun geri döngü isteği engellendiğinde
Yapılacak iş olduğunda WP-Cron, görevleri çalıştırmak için sunucuya kendi site adresindeki [wp-cron.php]'ye istek gönderttirir; bu geri döngü isteğidir. Bir güvenlik kuralı [wp-cron.php]'yi engelliyorsa geri döngü isteği 403 ile döner ve görevler çalışmaz.
Nginx ve Apache yapılandırmalı bir sunucuda [wp-cron.php] yalnızca 127.0.0.1'den açılacak şekilde kısıtlanınca geri döngü isteği 403 ile engellendi. Bunun nedeni sunucunun kendi alan adına gönderdiği isteğin genel IP üzerinden gelmesidir; [wp cron test] de aynı durum kodunu döndürür.
wp cron testError: WP-Cron spawn returned HTTP status code: 403 ForbiddenGörevler beş dakikadan fazla gecikmişken [Site sağlığı] ekranı açılınca [Önerilen iyileştirmeler] altında geri döngü uyarısı ve başarısız zamanlanmış olay birlikte göründü.

Kural silinince [wp cron test] yeniden başarılı oldu. Kuralı korumanız gerekiyorsa görevleri sistem cron'undan WP-CLI ile çalıştırın. WP-CLI çalışması HTTP isteğinden geçmediğinden aynı kural varken de gecikmiş görevler işlendi.
🔢 SSS & önerilen içerikler





ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.