Modern bir e-ticaret mağazası yalnızca ürünlerin listelendiği statik bir vitrin değildir; arka planda sürekli veri işleyen karmaşık bir makinedir. Tedarikçilerden gelen anlık stok ve fiyat listeleri, Merkez Bankası döviz kurları, ödemesi tamamlanmayan sepetler, rezerve edilmiş ama satın alınmamış ürün stokları ve dönemsel indirim kampanyaları kesintisiz bir otomasyon gerektirir. Tüm bu operasyonları bir insanın elle takip etmesi mümkün olmadığı gibi, en küçük bir gecikme mağazayı zarara uğratabilir. Bir cron job sistemi, bu döngüleri belirlenen zaman dilimlerinde dakika düzeyinde zamanlamayla tetikleyen görünmez motordur.
Bu rehberde; WooCommerce, Magento ve özel PHP altyapılı mağazalarda olmazsa olmaz cron senaryolarını, yoğun trafik anlarında veritabanı kilitlenmelerini (Deadlock) önleme tekniklerini, büyük XML/ERP kataloglarının bellek tüketmeden içe aktarımını ve terk edilmiş sepet e-postalarının doğru zamanlama stratejilerini adım adım inceleyeceğiz.
Hedef kitle: E-ticaret sitesi sahipleri, mağaza yöneticileri, backend geliştiricileri ve ajans teknik ekipleridir. Temel betik otomasyonu için ayrıca PHP cron job kılavuzumuzu inceleyebilirsiniz.
E-Ticaret Sitelerinde Cron Job'ların Kritik Rolü ve Yaşam Döngüsü
E-ticaret operasyonlarında cron job görevleri dört ana yaşam döngüsüne ayrılır: veri senkronizasyonu, gelir kurtarma, stok güvenliği ve sistem hijyeni. Bu görevlerin herhangi birinde yaşanacak aksama doğrudan finansal kayıp veya müşteri şikayeti olarak geri döner.
Örneğin tedarikçi API'sinden stok güncellemeleri çekilmediğinde, tükenmiş bir ürün sitede var görünür. Müşteri ürünü satın alır, ödemeyi yapar; ancak sipariş kargolanamadığı için sipariş iptali, komisyon kaybı ve marka güveninde kırılma yaşanır. Tam tersi senaryoda, döviz kuru güncellemesi aksadığında yabancı para birimine bağlı ithal ürünler eski kur üzerinden zararına satılabilir. Cron job'lar bu döngüyü otomatize ederek insan refleksinden bağımsız, kusursuz bir operasyon sağlar.
Olmazsa Olmaz E-Ticaret Cron Senaryoları
Bir e-ticaret platformunda sağlıklı bir gelir akışı ve operasyonel verimlilik için kurulması gereken dört ana sütun bulunmaktadır:
XML ve ERP Stok / Fiyat Senkronizasyonu
Tedarikçilerin sağladığı XML, JSON veya SOAP servisleri üzerinden katalog güncellemek en yaygın e-ticaret operasyonudur. Ancak 50.000 veya 100.000 ürün içeren bir XML dosyasını tek seferde indirmeye ve veritabanına yazmaya çalışmak sunucunun kilitlenmesine neden olur. Bu nedenle senkronizasyon scripti şu ilkelerle çalışmalıdır:
- Parçalama (Chunking): Ürünler tek bir devasa diziye alınmak yerine 500'erlik veya 1000'erlik gruplar halinde işlenmelidir.
- Yalnızca Değişen Veriler: Her ürün satırını körü körüne güncellemek yerine, mevcut stok ve fiyat hash değerleriyle karşılaştırma yapılarak yalnızca değişen kayıtlar için SQL
UPDATEsorgusu çalıştırılmalıdır. - Tükenen Ürünlerin Yönetimi: XML dosyasında yer almayan veya stoğu sıfıra inen ürünlerin sitede pasife alınması cron döngüsünün son adımı olarak kurgulanmalıdır.
Merkez Bankası (TCMB) Döviz Kuru Güncelleme
Türkiye Cumhuriyet Merkez Bankası (TCMB), gösterge niteliğindeki günlük döviz kurlarını her iş günü saat 15:30'da açıklar. Bu sebeple e-ticaret sitelerinde döviz kuru güncelleme cron görevini dakikada bir çalıştırmak gereksiz sunucu kaynağı tüketir ve TCMB sunucuları tarafından IP engeli almanıza yol açabilir.
İdeal zamanlama; iş günlerinde saat 15:45'te çalışan tek bir cron görevidir. Bu sayede açıklanan yeni kurlar sisteme aktarılır, döviz bazlı ürünlerin Türk Lirası fiyatları otomatik olarak yeniden hesaplanır.
Terk Edilmiş Sepet ve Yeniden Pazarlama E-Postaları
Baymard araştırmalarına göre e-ticarette sepetlerin yaklaşık yüzde 70'i satın alma tamamlanmadan terk edilmektedir. Terk edilmiş sepet cron'u, belirli bir süre boyunca işlem görmeyen sepetleri tespit ederek müşteriye hatırlatma e-postası veya indirim kuponu iletir.
Burada KVKK ve GDPR uyumu ile kullanıcı deneyimini gözetmek şarttır. Uygulanabilecek bir örnek zamanlama iki kademeli bildirimdir: birinci e-posta sepet terk edildikten tam 1 saat sonra (ürün henüz müşterinin aklındayken), ikinci e-posta ise 24 saat sonra gönderilir. Müşteriye aynı hatırlatmanın art arda gitmesini önlemek için veritabanında reminder_sent_at bayrağı tutulmalıdır.
İptal Edilen ve Ödenmeyen Siparişlerin Otomatik Tasfiyesi
Havale/EFT veya sanal POS 3D Secure aşamasında yarım kalan siparişler, veritabanında ürün stoklarını rezerve eder (bloke koyar). Eğer bu siparişler otomatik olarak tasfiye edilmezse diğer müşteriler tükenmiş görünen ürünleri satın alamaz. Özellikle Laravel cron job mimarisinde zamanlanan Artisan komutları ile 60 dakikadan uzun süredir "beklemede" kalan siparişler iptal edilir ve ayrılan stoklar stoğa geri iade edilir.
Sepet hatırlatmasını geliştirirken SMTP teslimi, kuyruk ve mükerrer gönderim kontrollerini cron ile e-posta gönderme akışı üzerinden ayrıca tasarlayın. Hosting satışı da yapan işletmeler, mağaza işlerini faturalama sistemi görevleriyle karıştırmamalı; WHMCS cron görevlerinin kurulumu ve WiseCP otomasyon görevlerinin yapılandırılması kendi panel ve dosya yollarıyla doğrulanmalıdır.
WooCommerce, Magento ve Özel Altyapılarda Cron Yapılandırması
Pek çok e-ticaret yöneticisi platformların yerleşik zamanlayıcılarına güvenir; ancak bu mekanizmalar gerçek cron değildir. Örneğin WooCommerce, WordPress çekirdeğindeki WP-Cron sistemini kullanır.
DISABLE_WP_CRON ile Gerçek Cron'a Geçiş
WP-Cron'un temel zafiyeti şudur: Görevler sunucunun saatine göre değil, siteye bir ziyaretçi geldiğinde sayfa yüklenirken tetiklenir. Mağazanız yeni kurulduysa veya gece trafiği düşükse, gece 02:00'ye ayarladığınız stok senkronizasyonu sabah 09:00'da siteye ilk ziyaretçi girene kadar hiç çalışmaz. WP-Cron normalde engellemeyen ayrı bir HTTP isteğiyle başlatılır; ağır işler yine de ortak sunucu kaynaklarını tüketerek ziyaretçilerin yanıt sürelerini artırabilir.
Büyük trafik anlarında ise her sayfa açılışı WP-Cron kontrolü yapacağından veritabanında gereksiz kilitlenmeler oluşur. Çözüm, WordPress'in yerleşik tetiklemesini kapatıp sunucu seviyesinde gerçek bir zamanlayıcı kurmaktır. Detaylı kurulum için WordPress cron job rehberimize göz atabilirsiniz.
Bunun için wp-config.php dosyasına şu satırı ekleyin:
// wp-config.php - Yerleşik ziyaretçi tetiklemesini kapat
define('DISABLE_WP_CRON', true);
Ardından sistem crontab'ına veya dış bir zamanlayıcıya 5 dakikalık tetikleme ekleyin:
*/5 * * * * /usr/bin/php /var/www/vhosts/magaza.com/public_html/wp-cron.php > /dev/null 2>&1
E-Ticaret Cron Görevleri İçin İdeal Zamanlama Tablosu
Tüm ağır görevleri aynı anda (örneğin gece yarısı 00:00'da) çalıştırmak sunucu işlemcisini ve diskini kilitler. Aşağıdaki çizelge, iş yükünü gün içine dengeli yayan ideal bir e-ticaret takvimidir:
| Operasyon | Önerilen Aralık | Cron İfadesi | Zamanlama Gerekçesi |
|---|---|---|---|
| Stok / ERP Senkronizasyonu | Gece 03:00 | 0 3 * * * |
Trafik minimum düzeydedir; kilitlenme riski düşüktür. |
| TCMB Döviz Kuru | İş günleri 15:45 | 45 15 * * 1-5 |
Merkez Bankası kurları 15:30'da yayımlar. |
| Ödenmeyen Sipariş İptali | Her 30 dakikada bir | */30 * * * * |
Rezerve stokları hızla satışa geri kazandırır. |
| Terk Edilmiş Sepet (1. Aşama) | Saat başı | 0 * * * * |
1 saat önce terk edilen sepetleri yakalar. |
| Google Merchant XML Feed | Gece 04:30 | 30 4 * * * |
Gece güncellenen yeni fiyat ve stokları reklama yansıtır. |
| Sipariş Durumu ve Kargo Takip | Gündüz her 15 dakikada bir | */15 9-19 * * 1-6 |
Kargo firması API'sinden teslimat verilerini çeker. |
Gerçek Kod Örnekleri
Üretim ortamındaki e-ticaret projelerinde doğrudan kullanabileceğiniz iki somut senaryo örneği aşağıda verilmiştir.
1. PHP / Laravel: Bekleyen Siparişlerin Stoklarını İade Eden Görev
Aşağıdaki Artisan komutu, 60 dakikadan uzun süredir ödeme bekleyen siparişleri iptal eder, ürün stoklarını güvenli bir veritabanı transaction'ı içinde artırır ve süreci loglar.
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use App\Models\Order;
use Carbon\Carbon;
class CancelPendingOrders extends Command
{
protected $signature = 'orders:cancel-expired';
protected $description = '1 saatten uzun suredir odenmeyen siparisleri iptal edip stoklari iade eder';
public function handle()
{
$esikZamani = Carbon::now()->subMinutes(60);
// Bekleyen ve suresi dolmus siparisleri al
$bekleyenler = Order::with('items')
->where('status', 'pending')
->where('created_at', '<', $esikZamani)
->limit(100)
->get();
foreach ($bekleyenler as $order) {
DB::transaction(function () use ($order) {
// Siparisi kilitle ve odeme durumunu yeniden kontrol et
$order = Order::whereKey($order->id)->lockForUpdate()->first();
if (!$order || $order->status !== 'pending') {
return;
}
// Stoklari geri yukle
foreach ($order->items as $item) {
DB::table('products')
->where('id', $item->product_id)
->increment('stock', $item->quantity);
}
$order->status = 'cancelled';
$order->cancelled_reason = 'Odeme zaman asimi nedeniyle otomatik iptal';
$order->save();
});
$this->info("Siparis #{$order->id} iptal edildi ve stoklar iade edildi.");
}
}
}
2. PHP: Terk Edilmiş Sepet Hatırlatma Betiği
Aşağıdaki script, sepet güncellenmesinin üzerinden 1 saat ile 2 saat geçmiş, ancak daha önce hatırlatma maili atılmamış kullanıcıları tespit eder ve gönderim sonrası bayrağı günceller; eşzamanlı çalışmalarda mükerrer gönderimi tek başına engellemez.
<?php
// /var/www/scripts/cart-reminder.php
require_once __DIR__ . '/db.php';
// 1 saat once birakilmis sepetleri bul (1 ile 2 saat arasi)
$stmt = $pdo->prepare("
SELECT c.id, c.user_id, u.email, u.name
FROM carts c
INNER JOIN users u ON c.user_id = u.id
WHERE c.status = 'active'
AND c.reminder_step = 0
AND c.updated_at BETWEEN DATE_SUB(NOW(), INTERVAL 2 HOUR) AND DATE_SUB(NOW(), INTERVAL 1 HOUR)
LIMIT 50
");
$stmt->execute();
$carts = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($carts as $cart) {
// E-posta gonderim mantigi
$mailGonderildi = mailGonder($cart['email'], "Sepetinizde urunler unuttunuz!", "Merhaba {$cart['name']}...");
if ($mailGonderildi) {
// Gonderim sonrasi bayragi guncelle; paralel calismalar icin ayrica kilit gerekir
$updateStmt = $pdo->prepare("UPDATE carts SET reminder_step = 1, reminder_sent_at = NOW() WHERE id = ?");
$updateStmt->execute([$cart['id']]);
}
}
Sık Karşılaşılan Hatalar ve Çözümleri
E-ticaret cron operasyonlarında en sık yaşanan kesintiler, sistem kilitlenmeleri ve çözüm yolları şunlardır:
Fatal error: Maximum execution time of 30 seconds exceeded
Neden: Büyük XML kataloglarının web sunucusu (Apache/Nginx) veya HTTP üzerinden tetiklenmesi ve PHP'nin varsayılan 30 saniyelik çalıştırma sınırına takılması.
Çözüm: Ağır içe aktarma işlemlerini HTTP üzerinden değil, doğrudan PHP CLI (komut satırı) ile çalıştırın. PHP CLI modunda max_execution_time varsayılan olarak sınırsızdır (0). HTTP üzerinden çalıştırmak zorundaysanız scripti chunk (parçalama) yapısına bölüp adım adım çalıştırın.
Deadlock found when trying to get lock; try restarting transaction
Neden: Ziyaretçi sitede sipariş verirken veritabanı ürün tablosunu kilitler. Aynı anda cron job da tedarikçiden gelen stokları güncellemeye çalıştığında iki işlem birbirinin kilidini bekler ve MySQL işlemi deadlock hatasıyla keser.
Çözüm: Stok güncellemelerini trafiğin en düşük olduğu gece saatlerine kaydırın. Toplu UPDATE işlemlerinde SELECT ... FOR UPDATE kullanırken sorguları ürün kimliğine (ID) göre sıralı yürütün ve veritabanı kütüphanenizde otomatik yeniden deneme (retry) mekanizması kurun.
Müşterilere Mükerrer Sepet Hatırlatma E-Postası Gitmesi
Neden: Bir önceki cron görevi henüz bitmeden sonraki cron görevinin başlaması veya scriptin hata aldığında veritabanındaki reminder_sent_at bayrağını güncelleyememesi.
Çözüm: Görevler başlamadan önce Linux flock komutu veya dosya kilidi (lockfile) kullanın. E-posta gönderilmeden hemen önce ilgili sepet kaydını "işleniyor" statüsüne alın veya gönderim biter bitmez durumu atomik olarak güncelleyin.
Fatal error: Allowed memory size of 134217728 bytes exhausted
Neden: 50.000'den fazla ürünün tek bir PHP dizisine (array) çekilerek sunucunun bellek sınırını (128 MB) aşması.
Çözüm: Veritabanı sorgularında fetchAll() yerine imleç (cursor) veya generator yapısı kullanın. XML okurken dosyanın tamamını hafızaya yükleyen simplexml_load_file yerine akış tabanlı okuyan XMLReader kütüphanesini tercih edin.
cronjob.com.tr ile HTTP Tabanlı Alternatif Kurulum
Özellikle paylaşımlı hosting (cPanel/Plesk) kullanan e-ticaret sitelerinde SSH erişimi bulunmayabilir veya sunucu işlemci limitleri yerel cron job çalıştırmaya izin vermeyebilir. Ayrıca yerel sunucu çöktüğünde üzerindeki cron da duracağından mağaza işleri aksar. Bu durumlarda cronjob.com.tr e-ticaret sitenizin web uç noktalarını dışarıdan güvenle tetikler.
- Mağazanızda dışarıdan çağrılacak bir API uç noktası oluşturun: Örneğin
https://magaza.com/api/cron/sync-rates. - Yetkisiz kişilerin bu URL'i çağırıp sunucuyu yormasını engellemek için gizli bir token başlığı tanımlayın (ör.
X-Cron-Token: E-TicaretGizliAnahtar2026). Başlık doğrulanmazsa HTTP 403 döndürün. - cronjob.com.tr üzerinde ücretsiz hesap oluşturun (kredi kartı talep edilmez).
- Yeni görev formunda URL adresinizi girin, HTTP metodunu (GET veya POST) belirleyin ve Headers alanına gizli anahtarınızı ekleyin.
- Zamanlama için hazır aralıklardan birini seçin ya da 5 alanlı cron ifadesi girin. Saat dilimi Europe/Istanbul olarak ayarlanabilir.
- Stok ve sipariş uç noktalarında zaman aşımı korumasından yararlanın: cronjob.com.tr cron ifadeli işlerde 290 saniyeye kadar yanıt bekler.
Sistem HTTP 200–399 durum kodlarını başarılı kabul eder. Eğer e-ticaret siteniz veritabanı kilitlenmesi veya sunucu çökmesi nedeniyle yanıt veremezse, ardışık hata eşiği (varsayılan 3) aşıldığında sistem yöneticisine e-posta ile bildirim gönderilir. 7 günlük log geçmişi sayesinde hangi güncellemenin ne kadar sürdüğünü panelden izleyebilirsiniz. Çözüm hakkında detaylı bilgi için ücretsiz cron job servisi sayfamıza göz atabilirsiniz.
Sıkça Sorulan Sorular (SSS)
WooCommerce'de neden gerçek bir cron servisi kullanmalıyım?
Ziyaretçi azken yerel WP-Cron tetiklenmez ve zamanlanmış işler gecikir. Ziyaretçi çok olduğunda ise her sayfa yükünde veritabanı sorgusu yaparak siteyi yavaşlatır. Gerçek bir sistem veya HTTP cron servisi görevleri ziyaretçiden bağımsız olarak planlanan aralıklarla tetikler; yürütme gecikmeleri yine de oluşabilir.
Döviz kurları günde kaç kez güncellenmelidir?
Türkiye Cumhuriyet Merkez Bankası (TCMB) gösterge niteliğindeki kurları her iş günü saat 15:30'da açıklar. Bu nedenle döviz kurlarını günde bir veya iki kez, özellikle saat 15:45 sularında güncellemek sistem yükü ve tutarlılık açısından yeterlidir.
Terk edilmiş sepet mailleri ne zaman atılmalıdır?
Terk edilmiş sepet hatırlatmalarında iki aşamalı bir örnek zamanlama, ilk e-postayı sepet terk edildikten 1 saat sonra, ikinci e-postayı ise 24 saat sonra göndermektir; uygun aralık mağazanın verilerine göre belirlenmelidir. Kullanıcıya mükerrer mail gitmemesi için veritabanında bayrak kontrolü yapılmalıdır.
Stok entegrasyonu gündüz yapılabilir mi?
On binlerce ürün içeren ağır XML veya ERP stok güncellemeleri veritabanında kilitlenmelere yol açabileceğinden gece 02:00 ile 05:00 saatleri arasında çalıştırılmalıdır. Gün içinde ise yalnızca anlık değişen kritik ürünler için hafif mikro güncellemeler tercih edilmelidir.
Sonuç
E-ticaret mağazalarının başarısı; stok doğruluğuna, doğru fiyatlandırmaya ve kesintisiz müşteri iletişimine bağlıdır. Yerleşik sözde-cron yapıları yerine profesyonelce kurgulanmış zamanlanmış görevler kullanarak hem sunucu kaynaklarını koruyabilir hem de cironuzu artırabilirsiniz.
Hemen Ücretsiz Cron Job Oluşturun
cronjob.com.tr ile e-ticaret sitenizin stok, fiyat ve sipariş uç noktalarını dakikada bir güvenle tetikleyin. Kredi kartı gerekmez, hata bildirimleri ve 7 günlük log kaydı tamamen ücretsizdir.
Ücretsiz Başla →