可以說我有一個PHP腳本將服務於一個大文件,我目前正在通過FTP上傳這個大文件。PHP:如何檢查一個文件當前是否正在寫入
如果上傳完成,我可以檢查我的PHP腳本嗎?有沒有例如一種方式,我可以檢查一個文件目前正在寫入或類似的東西?
更新:應該提到過這個,但我不是說通過上傳腳本上傳我正在談論上傳大的PDF文件或通過其他方式如FTP或SFTP等。
可以說我有一個PHP腳本將服務於一個大文件,我目前正在通過FTP上傳這個大文件。PHP:如何檢查一個文件當前是否正在寫入
如果上傳完成,我可以檢查我的PHP腳本嗎?有沒有例如一種方式,我可以檢查一個文件目前正在寫入或類似的東西?
更新:應該提到過這個,但我不是說通過上傳腳本上傳我正在談論上傳大的PDF文件或通過其他方式如FTP或SFTP等。
你可以在上傳腳本中使用一個有價值的文件(在temportantly目錄中),如果上傳完成,你可以簡單地將文件移動到你的最終位置,文件名稱很好。
這是該問題的常見解決方案。
對於獲得temportantly文件(環境無關)使用PHP函數:
resource tmpfile (void)
Documemtation它你可以在http://pl.php.net/manual/en/function.tmpfile.php 這個函數返回找到手柄到新的乾淨的臨時文件。
但是,如果您使用此功能,則必須在關閉句柄之前複製文件,因爲當您撥打fclose(handle)
時刪除了該文件。爲了得到文件緩衝區的保證是乾淨的,你可以在結束時致電fflush(handle)
。
或者如果你不想使用tmpfile(void)
函數,你可以做這個manualy。
string tempnam (string $dir, string $prefix)
前綴是文件的前綴,用於輕鬆地將她分組以刪除或其他內容。調用此函數獲得輸入目錄中唯一的文件,如目錄讓你臨時目錄在你的環境,你可以通過調用得到這樣的:
string sys_get_temp_dir (void)
然後,當你有自我臨時文件,寫入上傳數據和關閉。 複製使用此文件到您的最終位置:
bool copy (string $source, string $dest [, resource $context ])
和刪除您的臨時文件在您的通話環境弄乾淨:
bool unlink (string $filename [, resource $context ])
如果文件在上傳過程中被鎖定,試圖['flock'](http://de2.php.net/manual/en/function.flock.php)它從PHP返回'FALSE',然後你知道該文件被別的atm使用。 – Gordon 2010-06-26 11:51:58
@戈登:如果腳本是平行運行兩次,那意味着即使一個人成功了,另一個人也會失敗?要麼? – Svish 2010-06-27 10:23:58
如果上傳當前正在運行並且FTP對文件有鎖定,則兩個腳本都會返回false。如果沒有上傳,並且一個腳本會聚集文件,那麼是的,另一個會返回false。 – Gordon 2010-06-27 10:50:29