SORU
7 Ocak 2011, Cuma


Nasıl bir form gönderildikten sonra arka planda bir PHP komut dosyası çalıştırabilir miyim?

Sorun
Gönderilen temel kodu bilgileri teslim işlemi için çalışma ve bildirim bir web sitesinde görüntülemek için bir veritabanına eklediğiniz bir form var. Buna ek olarak, e-posta ve SMS mesajı ile bu bildirimleri almak için kaydolan kişilerin bir listesi var. Bu liste anı olarak önemsiz (sadece yaklaşık 150 iterek), ancak üzerinden abonelerin tüm tabloyu döngüsü ve 150 e-postalar göndermek için bir dakika Yukarı alır neden yeterli değil. (E-postalar, toplu e-posta politikaları nedeniyle bizim e-posta sunucusu, sistem yöneticileri tarafından talep edildiği gibi, ayrı ayrı gönderiliyor.)

Bu süre boyunca, uyarı göndermiş bireyin kendi bildirim yayınlanmadan herhangi bir olumlu pekiştirme olmadan neredeyse bir dakika için formun son sayfasında oturacak. Bu diğer potansiyel sorunları, ideal daha az hissediyorum, olası çözümleri bütün yol açar.

  1. İlk poster sunucu geri kalmış ve 'Gönder' düğmesine tekrar, komut ya da iki kez çalıştırın. baştan başlamak için tıklayın neden olduğunu düşünebilir Ben çözmek bu kullanarak JavaScript devre dışı bırakmak için düğmesine ve yerine metin bir şey söylemek gibi bir İşleme...', ancak bu o kadar da iyi sayılmaz çünkü kullanıcı yine de takılıyorum sayfanın uzunluğu komut dosyası yürütme. Eğer JavaScript devre dışı ise (ayrıca, bu sorun hala var.)

  2. İkincisi, poster SEKME veya tarayıcı zamanından önce formu doldurduktan sonra kapatın. Bu script tutmaya çalışan sunucu kadar çalışır yazmak için tarayıcı, ancak eğer kullanıcı daha sonra göz için herhangi bir sayfa içinde bizim etki alanı (süre script hala çalışıyor), tarayıcı kilitleniyor yükleme sayfa kadar senaryoyu sona erdi. (Bu sadece tarayıcının SEKME veya pencere kapalı ve tüm tarayıcı uygulaması yok olur.) Yine de, bu ideal daha azdır.

(Olası Bir) Çözüm
"Bildirim gönderildi sonra arayabilirim ayrı bir dosya içine. senaryonun bir parçası e-posta çıkarmaya karar verdim Ben bildirim başarıyla gönderildi sonra aslında onay sayfasında bu koymayı bile düşündüm. Ancak, kullanıcı bu script çalışıyor ve herhangi bir anormallik varsa onlara belirgin değildir; Bu komut başarısız olamaz.

Ama, eğer bir arka plan işlemi olarak bu komut dosyasını çalıştırmak miyim? Yani, sorum şu: Nasıl bir arka plan hizmeti olarak trigger ve kullanıcı form düzeyinde yaptığı da tamamen bağımsız çalıştırmak için bir PHP komut dosyası çalıştırabilir miyim?

DÜZENLEME:Buolamazcron tanımladı. Form anlık çalıştırmanız gerekir. Bu yüksek öncelikli bildirimleri. Buna ek olarak, sistem yöneticileri sunucularımız çalışan herhangi daha sık 5 dakika daha çalışmasını crons izin vermemek.

CEVAP
7 Ocak 2011, Cuma


exec shell_exec ı ile bazı deneyler yapmaya çalıştı mükemmel bir çözüm ortaya çıkardı! Başınıza gelen her bildirim işlemi günlük ben shell_exec (veya yok) seçtim. (shell_exec bir dize olarak döndürür ve bu exec bir değişkene atama çıktı ve sonra bir dosya yazmak için açılırken kullanarak daha kolay oldu.)

Aşağıdaki satırı e-posta komut dosyası çağırmak için kullanıyorum:

shell_exec("/path/to/php /path/to/send_notifications.php '".$post_id."' 'alert' >> /path/to/alert_log/paging.log &");

Önemli komut @netcoder tarafından belirttiği gibi) sonunda & dikkat çekicidir. Bu UNİX komut arka planda bir işlem çalışır.

Ekstra değişkenleri komut dosyası yolunu sonra tek tırnak içinde çevrili $_SERVER['argv'] olarak benim komut dosyası içinde arayabilirim değişkenleri ayarlanır.

E-posta komut dosyası günlük dosyası şöyle bir şey: >> ve çıkışını kullanarak çıktılar

[2011-01-07 11:01:26] Alert Notifications Sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 38.71 seconds)
[2011-01-07 11:01:34] CRITICAL ERROR: Alert Notifications NOT sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 23.12 seconds)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kupa World

    Kupa World

    1 EYLÜL 2011
  • Submissions101

    Submissions1

    23 ŞUBAT 2007
  • Tek Syndicate

    Tek Syndicat

    23 Temmuz 2008