2013-06-26 27 views
0

希望你能幫助!我目前正在構建和測試一個PHP腳本,該腳本將數據從一個Web系統移植到另一個Web數據庫(認爲數據備份),每日需要爲無限數量的用戶運行數據。該腳本相當密集,取決於需要拖動的數據量(迄今爲止我看到的最長執行時間約爲30分鐘)。在多個進程中運行一系列日常PHP腳本

鑑於此,我顯然不想一個接一個地運行它們,因爲整個工作無法及時完成。所以理想情況下,我想有一些方法來安排這項工作,以便它可以同時運行多達10個(我可以擴展爲服務器容量增加)備份。當一個腳本完成時,它會在堆的頂部拾取下一個(單個堆而不是10個)並執行,等等。現在,有可能(並且在現階段很可能)某些實例將因致命錯誤而失敗並死亡。這很好,因爲我正在使用自定義錯誤處理程序來處理它,但顯然我不希望一個實例的失敗對其他實例有任何影響。

在閱讀了這裏的其他一些問題之後,我已經看到了PHP分叉和Supervisord的討論,但說實話,把我的頭腦放回到我的進程調度文件已經打敗了我7年!如果可能的話,獲得一些關於如何實現這樣的事情的建議會非常好。謝謝:)

回答

0

我建議使用proc_open異步執行多個命令。如果備份過程本身就是一個PHP腳本,它可以使用PHP的二進制文件(例如PHP mybackupscript.php)運行

+0

好了,我怎麼可以使用它來設置上同時運行的進程數有限制嗎?據推測,這會發生某種回調,然後觸發旁邊的火災? – enragedlemon

+0

其實,我認爲以下方面可能會起作用 - 如果每個實例都叫做後續操作? do { \t $ resourse = $ database-> query(/ *某些查詢決定需要運行的下一個備份* /); \t if(!mysqli_num_rows($ resourse))break; \t $ back_result = $ resourse-> fetch_object(); \t $ backup_id_to_run = $ back_result-> backup_id; \t $數據庫 - >查詢(/ *更新備份記錄說,它已經開始,所以其他進程不會嘗試運行它* /); @include('/path/to/backup/script.php'); } while(true); 我認爲PHP 5.3的垃圾收集可以處理它?任何其他問題? – enragedlemon