2011-06-14 28 views
2

我有一個文件用於記錄客戶端的IP地址。他們想保留文件的最後500行。它在一個帶有PHP4的Linux系統上(哦,不!)。如何使用Linux或PHP將文件保持爲1000行?

我打算使用新的IP地址一次添加一行文件。我們無法訪問cron,因此我可能需要使此函數也可以執行行限制清理。

我想或者使用像exec('tail [some params]')或者可能用PHP讀取文件,在換行符中將其分解爲數組,獲取最後1000個元素並將其寫回。似乎有點內存密集雖然。

什麼是更好的方法來做到這一點?

更新:

每低於@ meagar的評論,如果我想用壓縮功能,我將如何做到這一點我的PHP腳本? (沒有進入的cron)

 
if(rand(0,10) == 10){ 
shell_exec("find . logfile.txt [where size > 1mb] -exec zip {} \;") 
} 

將拉鍊自動枚舉的文件,如果有一個現有的文件或做我需要做手工?

+6

處理此問題的更簡單和更標準的方法是定期輪換日誌文件。只要文件達到一定的大小時壓縮文件,並啓動一個新的日誌文件。您將結束當前的'.log'文件和一系列壓縮的'.log.1.gz','.log.2.gz'文件。 – meagar 2011-06-14 15:52:17

+0

我同意邁格爾這似乎是最好的方法,特別是與歷史的角度! – freshnode 2011-06-14 15:57:52

+0

@meagar是我可以從PHP做的事情嗎?我在該問題中添加了更新的部分。如果你可以發佈它作爲答案,我會接受它。 – cwd 2011-06-14 16:18:18

回答

2

最快的方式可能是,如你所說,使用尾巴:

passthru("tail -n 500 $filename"); 

(中繼不一樣的exec只是它輸出整個節目輸出到標準輸出可以使用捕獲輸出輸出緩衝)

[編輯]

我與以前的評論認爲,日誌旋轉將是無限美好......但你沒有,你沒有進入狀態,與cron所以我假設你可以不做logrotate。

0

您可以使用count(explode(「\ n」,file_get_contents(「log.txt」)))來獲取行數,如果它等於1000,則獲取從第一個\ n開始的子字符串到結束後,添加新的IP地址並再次寫入整個文件。 這與以+模式打開文件編寫新IP幾乎相同。

+0

如果必須在網站上進行每次點擊,這種方法非常痛苦。 – 2011-06-14 16:02:23

2

logrotate

這將是「正確」的答案,這並不難無論此設置。

+0

我不確定這是否甚至安裝在服務器上,但我會檢查出來。你有一個例子語法? – cwd 2011-06-14 16:20:40

+0

該鏈接在使用logrotate時有相當詳細的介紹。 – PHLAK 2011-06-14 16:31:34

+0

對,謝謝。我只是無法訪問任何配置文件。 – cwd 2011-06-14 18:19:13

相關問題