2011-03-14 51 views
3

我正在從其用戶每天接收約500張照片上傳的網站中工作。雖然這不是一個很高的數字,但我們正在經歷不同上傳之間的一些衝突。有些用戶報告看到另一張照片的縮略圖,而不是他們上傳的照片。我一直在尋找這個問題的解釋,我發現在計算器幾個問題:適用於處理大量文件上傳的技術

PHP temp file names for uploads colliding

PHP file uploads being "hijacked" by partial uploads

正如我已閱讀,這個問題似乎是相關的碰撞在文件tmp名稱中。爲了避免這種情況,我們考慮改變upload_tmp_dir PHP變量,這取決於從記錄的用戶名計算出來的整數,以減少碰撞概率。但是,該變量在運行時不可更改,因爲PHP開始執行時,該文件已經發布到服務器。

我不知道如何解決這個問題,我想解決它,以防止日後上傳速度不斷增加的未來問題。

有很多處理大量上傳的網站,所以我不知道如何避免碰撞問題。我工作的網站運行在PHP 5.2.14上。爲了簡單起見,我更喜歡PHP解決方案,但我也對現有的使用其他腳本語言的解決方案感興趣,只要它們保證上載之間不會發生衝突。

回答

1

問題也可能在於你的DBlogic。一種安全的方法是向數據庫插入一行,獲取記錄的主鍵。使用該號碼作爲文件名將防止衝突。你可以這樣做:

LOCK TABLES image WRITE; 
INSERT INTO image (id) VALUES (NULL); 
SELECT LAST_INSERT_ID(); 
UNLOCK TABLES; 

然後有你的(auto_increment)ID。您可以將其餘數據(例如標籤保存到不同的表格)並處理您的文件,並且名稱不會相互衝突。

+0

我們使用原始照片名稱+時間戳作爲後綴來創建文件名。當獲得$ _FILES ['tmp_name']字段vlue時,碰撞似乎發生。 – 2011-03-15 11:06:14

+0

APC有能力跟蹤上傳進度。也可以代替PHP的臨時名稱生成例程。值得一試。 (雖然它可以產生具有關機功能的怪異東西。) – vbence 2011-03-15 14:47:04