Php ve kesmek kullanıcı veri floş ama canlı komut tutmak için nasıl

4 Cevap php

I bazı uzun sorgular, onlarla yanlış bir şey içine keçe bir php + ajax uygulamasını geliştirirken Bu hileli bir soru, ama arka planda yapılabilir.

Ben sadece exec tarafından başka bir işlem () için gerçek işleme atma ise, ancak bu benim için doğru hisseder etmez kullanıcıya bir yanıt göndermek için bir yol var biliyorum, bu açıkları oluşturabilir ve sanal ile uyumlu hale getirmek pratical değil sunucular ve çapraz platform.

Onlar önbelleği basması üzerine yardım rağmen PHP ob_ * fonksiyonları sunuyor, ancak komut çalıştıran kadar kullanıcı bağlı tutacak.

Kullanıcı veri gönderme ve apache, ya da başka bir komut dosyasına gönderilen işlem verileri için daha az "kirli" bir yol ile bağlantısı / thread kapanış sonra çalışan bir komut dosyası tutmak için exec bir alternatif var merak ediyorum.

4 Cevap

Biraz araştırma yaptıktan sonra bu soru için 3 cevaplar bulduk:

  1. Zaman aşımı php, ignore_user_abort etkin olan planda, işleme tutacak ise JS sonraki adıma devam edecek ulaşıldığında, düşük bir zaman aşımı değeri bir ajax isteği yapmak.

  2. Doğrudan hemen cevap veya kısmi yanıt yapıyor kullanıcıya cevap komut dışında yavaş süreçlerini kırmak (eğer mümkünse, duruma bağlı olarak), düşük zaman aşımı ile cURL tarafından işçiye göndererek, bir _SESSION veya veritabanına yavaş proses değişkenlerini saklamak değeri VEYA işçi aramak için bir cron görevi olan.

  3. Gearman kullanın.

Ne benim web sitelerinde kullanmak olduğunu Gearman.

Gearman Eğer komut satırı üzerinden arka planda görev işçi çalıştırmak sağlar. Bu işçiler belirli görevler için istekleri dinlemek ve onlar bir istek aldığınızda sonra bunları işlemek.

Web uygulama tarafında, ben sadece $GEARMAN->doBackground("task_name","task_data"); ve ardından görev işçiye kapalı gönderilir ve yürütme komut için hemen döner yapmak.

Gearman görev bir PHP fonksiyonu olarak çalıştığı için exec yapmaktan daha güvenlidir.

Ben bir POSIX cini bir PHP sınıfı var. Ben başlatmak ve aslında senaryo var

while(1)
{
 // run task
}

veritabanı aramaları ve döngü her şeyi koyabilirsiniz - çok sinyallerini POSIX tepki - Ben genellikle 120 saniye boyunca uyku ayarlayın ve sonra tekrar çalıştırın. Benim kuyruk olan küçük bir masa ile birlikte kullanabilirsiniz. Peki yerine kullanarak ölümcül bir exec() Ben plan komut sonraki 30 saniye içinde yakalayacak olan benim kuyruk tabloya bir id eklemek için daha güvenli bir hazır deyimi kullanabilirsiniz.

ihtar - Ben daemon öldürmek ve bunu her 3 saatte bir yeniden, bazen takılıyor ve bir daha işlemez - ama basit bir öldürme ve her 3 saatte başlamak çalışan canlı kuyruklar almak için iyi bir takas olduğunu

edit Ben bütün komut göndermek istemiyorum ama elimden kimse onu istiyor