HTTP isteği PHP tamamlandıktan sonra kod çalıştırmak?

5 Cevap php

PHP bir kapatma fonksiyonu kaydetmek için bir mekanizma sağlar:

register_shutdown_function('shutdown_func');

Sorun PHP'nin son sürümlerinde, bu işlevi hala istek SIRASINDA çalıştırılıyor olmasıdır.

Ben isteği boyunca kodun herhangi bir parça veritabanına yapmalısınız bir giriş kaydedebilirsiniz (bu konularda Zend Framework) bir platform var. Sayfayı yavaşlatan, istek boyunca bireysel insert tablolara ton olması yerine, ben istek sonunda eklemek için bunları sıraya. Başka bir temizleme görevleri oturum ya da yapmak için zaman uzunluğu sayfanın, kullanıcının algılanan yükleme süresini etkilemez böylece HTTP isteği kullanıcı ile tamamlandıktan sonra ben bunu yapmak mümkün olmak istiyorum.

Bunu yapmak için PHP, yerleşik bir yöntem var mı? Yoksa harici bir yöntem ile paylaşımlı bellek alanı düzeni çeşit yapılandırmak ve günlük yapmak için bu süreci işaret gerekiyor?

5 Cevap

Eğer MySQL ekleme süreleri hakkında gerçekten endişe ediyorsanız, muhtemelen belirtileri değil, neden ele ediyoruz.

Örneğin, PHP / Apache süreci kullanıcı sonra çalıştırılması halinde bunların HTML alır, PHP / Apache süreci hala o istek içine kilitlendi. Meşgul olduğu için başka bir isteği birlikte gelirse, Apache, vb başka bir iş parçacığı çatal buna daha fazla bellek ayırmanız, ek veritabanı bağlantıları açmak zorundadır

Performans sorunları ile çalıştırıyorsanız, PHP / Apache yürütme ağır kaldırma kaldırmak gerekir. Eğer devam temizleme görevleri bir sürü varsa, siz değerli Apache süreçlerini yakıyorsun.

Ben bir dosyaya girişleri giriş düşünün ve bir crontab bant üzerinden veritabanına bu yük olurdu. Diğer ağır görevler varsa, bant dışına işi yapmak için bir kuyruk / iş işleme sistemini kullanın.

Aside from register_shutdown_function() there aren't built in methods for determining when a script has exited. However, the Zend Framework has several hooks for running code at specific points in the dispatch process. For your requirements the most relevant would be the action controller's post-dispatch hook which takes place just after an action has been dispatched, and the dispatchLoopShutdown event for the controller plugin broker.

Sizin için daha iyi bir uyum olacağını belirlemek için kılavuzunu okumalısınız.

EDIT: I guess I didn't understand completely. From those hooks you could fork the current process in some form or another. PHP has several ways to fork processes as you can read in the manual under program execution. I would suggest going over the pcntl extension - read this blog post to see an example of forking child processes to run in the background.

Üzerine yorumlar this random guy's blog istediğinize benzer ses. Bu başlık hile işe yaramazsa, bu blogda yorumların bir Web konağın yapılandırma böyle bir şey veriyorsa, arka planda çalıştırmak için ayrı bir PHP komut dosyası için exec() ING göstermektedir.

Bu tadı için biraz hackish olabilir, ama etkili ve basit bir çözüm olacaktır.

Eğer seçtiğiniz DB tarafından yönetilen bir "kuyruk" yaratmak ve ilk çıkış sonra, veritabanındaki sıra tablodaki in queue_id ile maç talimatları tetikleyecek bir komut yol açan bir iframe isteği depolamak edin veritabanı.

ex:

<?php
mysql_query('INSERT INTO queue ('instructions') VALUES ('something would go here');
echo('<iframe src="/yourapp/execute_queue/id?' . mysql_insert_id() . '" />');
?>

ve çerçeve gibi bir şey yapmak

ex:

<?php
$result = mysql_query('SELECT instructions FROM queue WHERE id = ' . $_GET['id']);
// From here, simply execute some instruction based on the "instructions" field, then delete the instruction from the database.
?>

Dediğim gibi ben bu hackish düşünebiliriz nasıl görebilirsiniz, ancak çerçeve kendi üst sayfasından bağımsız olarak yük olacak, dedi, bu yüzden arka planda diğer bazı uygulama çalıştıran olmadan istediğinizi elde edecek.

Bu en azından doğru yönde işaret umuyoruz.

Şerefe!

Peki ben aynı sorun koştu - Ben XMPP (Jabber) üzerinde bir rapor gönderirken bir yönlendirme engellemek istemedim. Bu :-( ... Bunun için bir çözüm yoktur, görünüyor