2017-08-14 75 views
0

我有一個壓縮圖像的cron腳本。它基本上遍歷文件夾,然後壓縮文件夾中的文件。我的問題是一些圖像正在中途處理。我的理論是,用戶正在上傳圖像,在圖像上傳文件之前,壓縮器會嘗試壓縮文件。從而壓縮半上傳的圖像,並導致顯示一半圖像。如何判斷文件是否已經在PHP中上傳完成?

  1. 有沒有在PHP中確認文件已完成上傳的方法?所以,我只能做一次壓縮,我知道該文件已被完全寫入?
  2. 或者,有沒有辦法檢查一個文件是否被另一個進程使用?
  3. 或者,它是否足夠可靠,可以查看文件何時「寫入磁盤」,並且在10分鐘之後才處理它?
+0

複製文件並壓縮複製。 –

+0

可以看看寫入文件的時間,實際上1分鐘的可靠性已經足夠。 http://php.net/manual/en/function.filemtime.php –

回答

3

PHP不會觸發你的動作,直到文件完全上傳,但它有可能爲你cron工作,開始他們之前完全保存與文件交互。

當從$_FILES保存某些內容時,請將其保存爲其前綴爲.的版本,以將其標記爲不完整。確保你的cron工作跳過任何這樣的文件。

然後,保存操作完成後,重命名文件而不使用.前綴以使其符合處理條件。

+0

我知道機會可能很小,但如果文件沒有完成「移動」,會發生同樣的情況嗎? – coderama

+0

@coderama重命名文件是一項即時操作,要麼是沒有完成,要麼是完成。複製文件需要很長的時間,在此期間它在目錄列表中,但不完整,導致您遇到的問題。 – tadman

1

有處理方案

標誌

設置標誌,文件之前修改/寫兩種方式。 我們的應用程序處理大量文件,我們在將它們處理完成之前設置標誌,一旦完成,我們移除標誌,因爲它在cron標誌上運行是處理文件的最佳方式。

通常,您可以在每個文件的表格上添加一列。或者您可以有一個數組,您可以在其中存儲所有當前處理的文件。

filemtime()

正如你提到的,您可以檢查一樣,如果文件mtime是當前時間,那麼你就壓縮他們超過10分鐘,但如果一些其他進程正在使用的文件打開在同一時間。它再次導致問題。

所以它更好的去與國旗。如果其他進程從不經常修改文件。

1

例如,您可以使用flock來確保文件未被使用,請參閱here。或者,您可以檢查圖像是否損壞或損壞,請參閱here

相關問題