2011-04-12 54 views
0

我希望我能得到一些建議。PHP CRON作業與用戶登錄的調用函數

我在我的PHP/MySQL系統中擁有會計分類帳,並且每隔一段時間就會打到分類賬的發票(對於這個例子,我們只是每月說一次)。我也有滯納金,需要在特定日期後申請。發票的「過帳」日期以及「這是遲到」日期已在數據庫中。

我想知道哪個是更好的方法來運行自動應用分類賬項目的腳本(每月一次) - 並自動輸入延遲費用(如果需要,也會每月進行一次)。對於系統的所有用戶來說,這些日期是不同的 - 就像我說的,所有的都存儲在數據庫中。我的選擇,因爲我看到它是:

  • 有運行,每天一次(即中午12:00每一天)cron作業 - 通過每一個項目開始,在做的工作,如果日期條件得到滿足。

    我想我喜歡這種方法,因爲它每天都在同一時間處理所有事情。

    我很擔心這種方法,因爲:(1)如果我的服務器在我的CRON工作計劃時關閉,CPANEL現在是否完全跳過? (2)如果我有100k甚至1億條條目篩選,那麼在運行時,這會對我的服務器造成難以承受的負載嗎?

  • 調用此腳本在「做工作」,如果日期條件都滿足,只有當相關用戶登錄。

    爲什麼我不喜歡這種方法儘可能多的原因,是因爲它得到告訴申請多少發票越來越複雜,需要支付多少滯納金。另外,我有一個「管理員」的用戶誰可以看到每一個人每一件事 - 即用戶可能有沒有及時更新臺賬信息租客已沒有足夠的最近登錄...

    我喜歡的reasn這種方法,是因爲它顯然是在服務器上的負載較小...

也許我在思考的東西。不知道...但建議將不勝感激。 謝謝。

+0

如果用戶在一年內沒有登錄您的系統會怎麼樣 - 您不會向他發送發票? – zerkms 2011-04-12 02:26:22

+0

如果你每天都這樣做,你真的希望有大量1億行需要更新?對於你的第二種情況,我建議做2件事。 1.管理員查看特定用戶時的計算結果。 2.如果您在頁面上有任何統計數據,請給管理員一個按鈕來同步數據。現在,因爲用戶可能永遠不會返回,因爲你的管理員可能是懶惰的。你可以嘗試兩種方法的組合。附:據我所知,如果cronjob失敗。它被「跳過」。 – Khez 2011-04-12 02:29:59

+0

** @ zerkms ** - 當我看到您的觀點時,事實仍然是我希望代碼能夠最終保持穩健...並且持續2-3個月,直到認真收集資金是很常見的... * * @ Khez ** - 我不會更新100Mil行,但我將不得不檢查100Mil行... – Shackrock 2011-04-12 02:36:09

回答

1

我認爲最好的選擇是使用cron選項卡,爲您提到的所有好處。我想補充一點,如果你使用一個事務安全表(如INNODB),並記錄cron選項卡的完成情況,如果表在crontab期間崩潰,則更改將被還原,並且您可以檢查日誌以查看日期崩潰了,以便您可以手動進行更改。事實上,如果您在表中記錄了crontab任務的完成情況,則可以使用該日誌(抓取多少天前該腳本最後運行)來自動處理錯過的日期。

就服務器負載而言,一次更新多條記錄可能不會有太多問題。問題是,使用正確結構化的查詢時,應該只根據具有與所選參數匹配的日期的記錄進行更新(或插入)。你不需要實際循環數據庫中的每個記錄。

+0

您的意思是「交易安全」表是什麼意思?我沒有使用'INNODB',因爲'myisam'對於「噸讀」來說更好,「據我所知...(我的解決方案有更多的讀取而不是寫入)。 **進一步**,我仍然需要遍歷每個記錄來檢查日期,對吧?我無法擺脫這一點。當然,我只需要在條件滿足的情況下更新。 – Shackrock 2011-04-12 13:26:46

1

我認爲cron工作是一個好主意。然而,你可能希望有某種方法將項目(行?)標記爲「已處理」。你的cron工作應該尋找「未處理」的數據,而不是按日期。這是,恕我直言,更安全,並會解決問題,如果工作失敗,出於某種原因運行。

我在我的一個應用程序中有一個類似的功能。但是,它更像是一種隊列風格。任務從應用程序的任何部分進入隊列。工人(可以通過cron觸發)通過隊列並完成任務並將其標記爲「正在處理」,然後進行處理。如果下一個工作人員出現並發現任務「正在處理」,它會檢查工作人員以確保它不是殭屍。如果是,它會將其關閉,然後重新啓動任務。等等等等等等

我實際上有一個主隊列,可以容納各種類型的任務(電子郵件通知,文件更新等),然後工作人員處理主隊列進入作業特定的隊列(一個用於電子郵件等)。