Sorun
Gönderildiğinde, gönderilen bilgileri işlemek için temel kodu çalıştıracak ve bir bildirim web sitesinde görüntülenmek üzere bir veritabanına ekleyecek bir formum var. Ek olarak, bu bildirimleri e-posta ve SMS mesajıyla almak için kaydolan kişilerin bir listesi var. Bu liste şu an için önemsizdir (yalnızca 150'yi iter), ancak tüm abone tablosunda dolaşıp 150'den fazla e-posta göndermenin bir dakikadan fazla sürmesine neden olmak yeterlidir. (E-postalar, toplu e-posta politikaları nedeniyle e-posta sunucumuzun sistem yöneticileri tarafından talep edildiği şekilde ayrı ayrı gönderilir.)
Bu süre zarfında, uyarıyı gönderen kişi, bildiriminin yayınlandığına dair herhangi bir olumlu destek olmadan formun son sayfasında neredeyse bir dakika oturacaktır. Bu, başka olası sorunlara yol açar, tüm olası çözümlere sahip olanların idealden daha az olduğunu düşünürüm.
İlk olarak, poster sunucunun geciktiğini düşünebilir ve 'Gönder' düğmesini tekrar tıklayarak komut dosyasının yeniden başlamasına veya iki kez çalışmasına neden olabilir. Bunu, düğmeyi devre dışı bırakmak için JavaScript kullanarak ve metni 'İşleniyor ...' gibi bir şey söyleyecek şekilde değiştirerek çözebilirim, ancak bu idealden daha az çünkü kullanıcı, komut dosyası yürütme süresi boyunca sayfada kalmaya devam edecek. (Ayrıca, JavaScript devre dışı bırakılmışsa, bu sorun hala mevcuttur.)
İkinci olarak, formu gönderdikten sonra poster sekmeyi veya tarayıcıyı erken kapatabilir. Komut dosyası, tarayıcıya yeniden yazmaya çalışıncaya kadar sunucuda çalışmaya devam edecektir, ancak kullanıcı alanımızdaki herhangi bir sayfaya göz atarsa (komut dosyası hala çalışırken), tarayıcı komut dosyası bitene kadar sayfayı yüklemeyi askıya alır. . (Bu, yalnızca tarayıcının bir sekmesi veya penceresi kapatıldığında ve tarayıcı uygulamasının tamamı kapalı olduğunda olur.) Yine de, bu idealden daha azdır.
(Olası) Çözüm
Komut dosyasının "e-posta" kısmını, bildirim gönderildikten sonra arayabileceğim ayrı bir dosyaya bölmeye karar verdim. Başlangıçta bunu, bildirim başarıyla gönderildikten sonra onay sayfasına koymayı düşündüm. Ancak, kullanıcı bu betiğin çalıştığını bilmeyecek ve herhangi bir anormallik onlara görünmeyecektir; Bu komut dosyası başarısız olamaz.
Peki ya bu komut dosyasını bir arka plan işlemi olarak çalıştırabilirsem? Öyleyse sorum şu: Bir PHP betiğini bir arka plan hizmeti olarak tetiklemek ve kullanıcının form düzeyinde yaptıklarından tamamen bağımsız olarak çalıştırmak için nasıl çalıştırabilirim?
DÜZENLEME: Bu olamaz cron'ed edilecek. Form gönderildiği anda çalıştırılmalıdır. Bunlar yüksek öncelikli bildirimlerdir. Ayrıca, sunucularımızı çalıştıran sistem yöneticileri, cron'ların 5 dakikadan daha sık çalışmasına izin vermez.
exec()
ama bunu hiç denemedim.
ajax
ve ekliyorum sleep()
(benim durumumda foreach kullanıyorum). Sunucumda mükemmel çalışıyor. Başkaları hakkında emin değilim. Ayrıca testime göre komut dosyasının ve olmadan görevi tamamlayan komut dosyasının kullandığım sunucu tarafından durdurulmamasını sağlamak için döngüden önce ignore_user_abort()
ve set_time_limit()
(hesaplanan bitiş zamanıyla) ekliyorum . ignore_user_abort()
set_time_limit()
gearman
Arka plan görevleriyle uğraşmak için php ile kullanıyorum . Büyük zamanlı işleme ve ağır yüklerle karşılaşırsanız ölçeklendirmek mükemmeldir. Ona bir bakmalısın.