2013-08-28 29 views
4

我需要使用PHP的copy()函數將文件從一個位置複製到另一個位置。我故意不使用rename()PHP copy()如何處理內存

這些文件是500MB到1GB。似乎在啓動PHP腳本後需要大約10-20秒才能移動它們(每個執行一個文件)。

我的服務器被拒絕這些文件,因爲max_execution_timepost_max_sizeupload_max_filesizememory_limit值,所有這一切都設置高的離譜的上傳,但是服務器,當我試圖上傳只是超時。

現在我擔心,如果這個copy()操作正在運行,而網站正在處理大量的流量,服務器將失敗。

所以我的問題是,PHP的copy()的運行方式會超載服務器的內存和/或執行時間限制嗎?

我知道PHP腳本需要花費很多時間才能完成,但我希望時間本質上只是一段低內存的「等待時間」,因爲PHP坐回來並讓服務器操作系統移動文件...我不認爲PHP需要將文件加載到緩衝區或類似的東西來拷貝它,但是在這個層次上的內存討論是我理解的一個話題。

任何人都可以解釋PHP copy()如何使用內存,以及是否有任何與內存過載相關的風險?

+1

複製我懷疑會使用os函數(當然這也是你的選擇)它不會讀整個文件到內存 – 2013-08-28 20:43:11

+1

我不知道內部,但'copy()'不需要很多記憶。通常,文件複製(如果沒有完全委託給OS例程)只是使用一個kb的小緩衝區來獲得讀寫系統調用的合理開銷。大多數IO緩衝將由文件系統緩存完成,這些緩存不在PHP的範圍之內,並且不受'memory_limit'的影響。然而,很多東西與PHP有點尷尬,所以copy()可能也是。 – dronus

+0

似乎在歷史的某個時刻'copy()'確實花費了太多的內存來做一些尷尬的事情:https://bugs.php.net/bug.php?id=29922 – tmsimont

回答

2

看着the sourcecopyitworksultimately通過讀取和寫入的塊8KB size - 這樣就不會落得分配一大堆服務器的內存中。正如人們已經評論的那樣,這當然是人們希望發生的事情。

但是,並行運行的大文件的多個副本可能會很容易地破壞存儲介質的性能(特別是如果它是由旋轉鏽蝕製成的話),這反過來又會導致副本花費大量的時間來完成。這可能很容易超過腳本的最大執行時間限制,因此在開始複製之前刪除限制是個好主意。

+0

更安全\ esier \更高效地調用你認爲的OS拷貝功能? – 2013-08-28 20:50:52

+0

@Dagon:您無法直接調用OS文件級別的複製功能(甚至可能不存在)。你可以產生一個拷貝的外部進程,但我不確定你是否能指望更快。如果發生錯誤,這肯定會使得看到問題變得更加困難。 – Jon

+0

我會在更高負載的服務器上嘗試一下,看看它是否會導致任何問題,謝謝。一次只能複製一個文件,所以聽起來好像我沒問題。 – tmsimont