2011-07-07 16 views
11

Göndermek ve e-posta göndermek için php'de ayrı bir iş parçacığı başlatmanın bir yolu olup olmadığını merak ediyorum. Bir iPad uygulamasından bazı bilgileri alan ve daha sonra verileri bir db'ye ekleyen ve daha sonra bir e-posta gönderen küçük bir web servisim var. Sorun şu ki, bazen e-postanın gönderilmesi çok uzun sürüyor ve iPad'in isteği zaman aşımına uğruyor. E-postayı ayrı bir konuya gönderebilmemin bir yolu var mı? Temel olarak e-posta gönderilmeden önce iPad'in her şeyin başarılı olduğunu söylemek istiyorum.php içinde ayrı bir thread e-posta ile gönderme

Bazı örnek kod:

... Process info and insert into DB 
echo "success"; //this should be returned to the iPad right away. 

//start new thread here or possibly fork??? 
$email->send(); 

teşekkürler!

+0

PHP, yerel çoklu iş parçacığına sahip değil, bakın: http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications – feeela

cevap

5

Belirtildiği gibi PHP'nin çoklu okuma yetenekleri yoktur, ancak çoklu işleme işlevselliği vardır. İlkini e-postayı işlemek için arayacak ikinci bir PHP oluşturabilir ve çağırabilirsiniz. Bu betiğin komut satırında çalışabilmesi gerekiyordu.

exec('nohup php emailscript.php >/dev/null 2>&1 &'); 

Nohup'a ve ondan sonra her şeye sahip olmak çok önemlidir. Yaptığı şey, süreci arka planda tutmak ve tüm çıktıları yönlendirmektir. Aksi halde PHP, bir şeyleri bitirmesi ve geri vermesi için bekleyecektir. Nohup, ana çağrı işlemi sona erdiğinde komut dosyasının işletim sistemi tarafından öldürülmediğinden emin olacaktır.

Bir şekilde e-posta bilgilerini komut dosyasına aktarmanız gerekir. Bilgileri bir veritabanına koyabilir ve bir kayıt kimliğini iletebilir, bilgileri parametre olarak veya başka bir dizi seçenek olarak iletebilirsiniz.

1

Verileri istemciye geri göndermek ve PHP betiğinizin çalışmaya devam etmesini sağlamak için bir ob_flush() yürütmek istediğinizi düşünüyorum. ob_flush()'dan sonra daha fazla gönderemeyeceğiniz için, müşteriye geri göndererek yapılması gerektiğini unutmayın.