Ajax kullanarak uzun sunucu tarafında işlemleri ile ilgili?

4 Cevap php

I've a particularly long operation that is going to get run when a user presses a button on an interface and I'm wondering what would be the best way to indicate this back to the client.

The operation is populating a fact table for a number of years worth of data which will take roughly 20 minutes so I'm not intending the interface to be synchronous. Even though it is generating large quantities of data server side, I'd still like everything to remain responsive since the data for the month the user is currently viewing will be updated fairly quickly which isn't a problem.

I thought about setting a session variable after the operation has completed and polling for that session variable. Is this a feasible way to do such a thing? However, I'm particularly concerned about the user navigating away/closing their browser and then all status about the long running job is lost.

Belki o başladı ve bittiğinde yerde işlem kaydını konaklamayı bir kayıt eklemek için daha iyi olurdu. Kullanıcı (veya kullanıcılar), şu anda başarısız / bitmiş / yürütme işleri izleyebilirsiniz böylece daha sonra arabirimi diğer bazı tür oluşturmak?

Ben de herhangi bir kaynak herkes bakmak olabilir mi?

Bunu nasıl yaptın?

4 Cevap

Kod sunucu tarafı kısmı spawn veya web sunucusu dışında yaşayan bir süreç ile iletişim kurmak gerekir. Bir cin tarafından ele alınmalıdır görevleri çalıştırmak için web sayfa kodu kullanarak sadece özensiz eseridir.

Onları 20 dakika boyunca asılı bekleyemezsiniz. Hatta dünyanın en kooperatif kullanıcılar çıkmak ve başka bir şey yapmak, unutmak, ve pencereyi kapatmak için bağlanmıştır. Mantıklı bir HTTP aşımı herhangi bir şans böyle uzun bağlantı süreleri vidaları kadar izin ve çok önemsiz DOS açık bırakır.

Spencer da anlaşılacağı gibi, bu kullanıcı, ya da ne istersen karşı oturumda veya bir veritabanında id saklamak, geri AJAX cevaben bir id geçmek, http isteği bağımsız bir süreci başlatmak için ilk isteği kullanabilirsiniz. Kullanıcı daha sonra istediğinizi yapabilirsiniz ve görevi kesme olmaz. Id durumu yoklamak için kullanılabilir. Bir DB kaydedin, kullanıcı, kapalı oturum çerezleri temizlemek ve onlar size geri oturum açtığınızda hala görevin durumunu almak mümkün olacak olabilir.

Oturum Herhalde görevler listesinde çeşit tasarım istiyorsunuz, o realible değildir. Yani kullanıcı başına görevlerin kayıtlarını tutabilirsiniz. Bu tasarım ile ben farkında kullanıcı tutmak için, "bitti" görevleri göstermek mümkün olacak.

Ayrıca ben işçi sürecin dışında uzun bir işlemi hareket edecektir. Web sunucuları restrated olabilir çünkü bu gereklidir.

Ve, evet, ben ajax çağrıları ile sunucudan statü saniye her onlarca talep edecektir.

Periyodik olarak herhangi bir iş yapılır, sunucu görmek için ping JS zamanlayıcı olabilir. Kullanıcı uzağa gider ve geri gelir eğer zamanlayıcı yeniden başlatın. Işi bittiğinde onlar linke tıklayın ve raporu açın böylece (ben tavsiye etmem bu yapılabilir ama zorla bir şey yüklemek) kullanıcıya göstermektedir