Bir web istekten sonra arka plan işlemlerini Koşu

3 Cevap php

Ben bir web isteği sonrası işlemler başlıyor, ya da ilk dişli bittikten sonra muhtemelen yeni bir süreci çatalladıktan ilgileniyorum.

Çünkü ben koşacağım işlerin niteliğine ve ne sıklıkta çalıştırmak gerekir ki, bir cron kullanmamayı tercih ediyorum, yenilemek için bir dakika bekleyen bir seçenek değildir.

Ben bunu bir kaç yolu düşünüyorum:

1) ('/ run_jobs.php? Iş = 123') örneği ajax için, sonra görevleri çalıştırır sonra, süreci başladı ve hemen döner javascript bir sayfa arama .... anladınız

Bir iş parçacığı bittikten sonra 2), yeni bir konu çatallamak; yani output_page (); Yeni Konu (); run_job (123); exit ();

Herkes konuyla ilgili herhangi bir fikir ya da bu deneyimi var.

3 Cevap

Peki çalıştırmak istediğiniz işe bağlıdır. Bir daha karmaşık ama daha ölçeklenebilir ve denetlenebilir yaklaşım başlatmak ve controljobs için Gearman kullanıyor. Güzel şey de diğer kutulara soyour web sunucusu tam yük almazsınız işleri dağıtabilir.

Kolay bir yaklaşım gibi exec ve nohup kullanıyor

<?php
exec("nohup /usr/bin/php script.php >/dev/null 2>/dev/null &");
?>

Önemli kısmı PHP sürecinden çıkış kanalları dettach için vardır. Eğer bir veritabanında saklamak olabilir sürecinin sonucunu ForReading.

Bu gün bu tür bir şey işleme standart yolu Mesajlaşma Kuyruk sistemidir. Isteğinizin sonunda kuyruğuna mesaj gönderebilirsiniz. Sonra, sürekli sıranın dışında geri mesajları okuma ve çalıştırmak gerekir işleri çalışıyor (örneğin, birden fazla crons) çalışan dış sürecinin bir tür var

Zend Queue PHP için popüler bir seçimdir.

Önerdiğiniz çözüm olarak, (HTTP isteği başarı veya başarısızlık hakkında hiçbir garanti yapar) bir Ajax isteği bitirmek için gidiyor emin olamaz, bu yüzden eğer relying iş çalışıyor. Ben bu tür iş, ama en iyi seçenek olmadığını gördük. Senin isteğin sonunda bir süreç çatallamak bir performans kabus olacak.

Ben bu test değil ama burada bir fikir.

Curl kullanarak, uyumsuz newprocess.php (veya yeni bir süreç komut dosyasının bulunduğu yerde.) Böyle bir istek yapmak için nasıl http://stackoverflow.com/questions/962915/how-do-i-make-an-asynchronous-get-request-in-php de işlev curl_post_async bakabilirsiniz bir istek gönderebilir.

Emin sadece newprocess.php kapalı atabileceği emin olmak için bazı kimlik doğrulaması yapmak isteyebilirsiniz ...