2009-12-08 109 views
3

我有興趣在web請求之後啓動進程,或者可能在初始線程完成後分叉新進程。在網絡請求後運行後臺進程

我不希望使用cron,因爲我將運行的工作的性質以及需要運行的頻率,等待一分鐘刷新不是一個選項。

我考慮這樣做的幾種方法:)中調用JavaScript的網頁揭開序幕的過程,並立即返回

1,那麼之後運行任務,例如AJAX('/ run_jobs.php?工作= 123')....你有想法

2)線程完成後分叉新線程;即output_page();新線程(); run_job(123);出口();

任何人對這個主題有任何想法或有這方面的經驗。

回答

4

那麼這取決於你想要運行的工作。一個更復雜但更具可擴展性和可控性的方法是使用Gearman來啓動和控制作業。好的是你可以將作業分發到其他盒子,這樣你的Web服務器就不會滿負荷。

的簡單的方法是使用exec和nohup

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

最重要的部分有脫離從PHP過程中的輸出通道。爲了讀取進程的結果,你可以將它存儲在數據庫中。

+0

我選擇這個作爲回答,因爲它涵蓋了這兩種情形。有時你只需要一個非常簡單的東西在一個較小的網站,沒有掛斷執行處理這個。 – Eduardo 2016-06-03 11:07:21

3

現在處理這種事情的標準方式是消息隊列系統。在您的請求結束時,您會將消息發送到隊列中。然後,有一些外部進程正在運行(例如多個cron),它不斷地將消息讀出隊列並運行需要運行的作業。

Zend Queue是PHP的流行選擇。

至於你提出的解決方案,你不能肯定的是,一個Ajax請求將完成(HTTP不進行關於成功或請求失敗擔保),所以如果你是在工作中依靠運行。我已經看到了這樣的工作,但它不是最好的選擇。在請求結束時分叉進程將成爲性能噩夢。

1

我還沒有測試過,但這裏有一個想法。

使用curl異步地向newprocess.php發送請求(或者您的新進程腳本所在的位置)。您可以查看函數curl_post_async,在How do I make an asynchronous GET request in PHP?處瞭解如何進行此類請求。

您可能需要做一些驗證,以確保只有你能火過newprocess.php ...