我需要升級一個Perl CGI腳本,用戶必須完成3個步驟。完成每個步驟後,腳本將記錄用戶完成的步驟。記錄這一點很重要,因此我們可以向用戶證明他們只完成第一步,並且沒有完成所有三個步驟。併發使用Perl追加到同一個文件
現在,腳本正在爲CGI腳本的每個實例創建1個日誌文件。因此,如果UserA執行步驟1,則UserB將執行步驟1,然後執行步驟2,然後執行步驟3 - 然後UserA完成步驟2和步驟3,日誌文件的順序將爲。
LogFile.UserA.Step1
LogFile.UserB.Step1
LogFile.UserB.Step2
LogFile.UserB.Step3
LogFile.UserA.Step2
LogFile.UserA.Step3
日誌文件以當前時間戳,隨機數和過程PID命名。
這可以很好地防止同一個文件被寫入多次,但目錄很快就會獲得數千個文件(每個文件只包含幾個字節)。有一個過程可以旋轉和壓縮這些日誌,但它已經讓我失望,因此腳本每天只能記錄一個文件,以減少正在創建的日誌文件的數量。
基本上,日誌文件將在文件名中包含當前日期,並且只要CGI腳本需要寫入日誌,它將追加到當天的一個日誌文件,而不管用戶或步驟他們在。
什麼都不需要讀取日誌文件 - 唯一會發生的是CGI腳本的追加。日誌輪換將在7天或更早的日誌文件上運行。
我的問題是,處理併發追加到這個日誌文件的最好方法是什麼?在追加之前是否需要鎖定它?我在Perl Monks上發現了this page,它似乎表明「當多個進程正在寫入同一個文件,並且所有文件都打開了要添加的文件時,數據不會被覆蓋。」
我已經瞭解到,僅僅因爲它可以完成並不意味着我應該這樣做,但在這種情況下,最安全的最佳實踐方法是什麼?
摘要:
- 併發追加到同一個文件
- 每個追加到該文件僅僅是一個線,不到50個字符
- 順序並不重要
謝謝!
gbacon做這項權利,但一些重要的調整自己的代碼時,要記住:你*不*解鎖('LOCK_UN')的文件 - 你將其關閉。這將確保數據被刷新,然後*解鎖它。 – hobbs 2010-03-03 05:00:42
謝謝gbacon。訂單不重要,所以這不是問題。我不完全確定是否需要分叉我的案件。由於這是一個CGI腳本(不是快速的CGI - 它不會保持活躍狀態),用戶將只能夠在腳本生命週期內執行1個步驟 - 一旦他完成一個步驟,腳本將退出。然後,在網絡上他正在執行第2步,點擊提交,第2步將被記錄,腳本退出。 – BrianH 2010-03-03 14:31:08
@BrianH我不清楚:分叉的孩子模擬多個併發客戶端。在你的CGI程序中,從我的答案中調用一個類似於'log_step'的子實體,以記錄真實用戶完成的步驟。 – 2010-03-03 16:25:57