2012-03-13 84 views
0

給出一個簡單的代碼,如:PHP - 如何保證正確的命令執行順序

$file = 'hugefile.jpg'; 
$bckp_file = 'hugeimage-backup.jpg'; 
// here comes some manipulation on $bckp_file. 

假設的問題是,如果該文件是大是巨大的 - let's說JPG - 人們會認爲它將花費一些時間來複制服務器(我的意思是甚至幾毫秒) - 但也會假設下一行的執行速度會快得多。所以在理論上 - 我可能會以「不」此類文件或目錄「嘗試操作尚未創建的文件時發生錯誤 - 或者更糟糕 - 開始操作TRUNCATED文件。

我的問題是我如何確保$ bckp_file在NEXT行處理之前成功創建(或在這種情況下被複制)。

我的選擇是「暫停」,「延遲」下一行執行,直到文件創建/複製完成?

現在我只能想到像

if (!copy($file, $bckp_file)) { 
    echo "failed to copy $file...\n"; 
} 

這隻會提醒我,但不會解決任何問題(同樣喜歡具有PHP錯誤)

if (copy($file, $bckp_file)) { 
    // move the manipulation to here .. 
} 

但是這也不是很有效 - 因爲我們說這個副本沒有執行 - 我只是走出循環而沒有實現我的目標,沒有錯誤。

這是一個問題,還是我過度思考? 或者PHP有一個內置機制來確保? 任何推薦的做法? 關於這個問題的任何想法? ??

回答

2

什麼是我的選擇,「暫停」,「延遲」的下一行執行,直到該文件的創建/拷貝完成

副本()是同步的功能意味着代碼將不會繼續在調用copy()之後直到copy()完全結束或失敗。

換句話說,沒有魔法介入。

if (copy(...)) { echo 'success!'; } else { echo 'failure!'; } 

與同步IO一起,還有異步IO。在技​​術細節上解釋有點複雜,但總體思路是它在後臺運行,並且代碼會嵌入到其中。然後,無論何時發生重大事件,後臺執行都會提醒您的代碼。例如,如果您要異步複製文件,則需要將偵聽器註冊到進行復制時會收到通知。那樣的話,你的代碼可以同時做其他事情,但是你也可以知道在文件上取得了哪些進展。

+0

感謝您的回答。沒有什麼不在問題的範圍之內 - 因爲我正在努力學習更多並且更多地理解:-)。在問題中提到的另一個問題 - 在TRUNCATED文件的情況下是什麼? php-synchronous-mechanisem檢查是否完整?因爲再理論上 - 一個.jpg文件可以被創建並保存/複製,但包含虛假信息(我們都從網上看到了半灰色的jpg文件..) – 2012-03-13 06:01:59

+0

已更新我的答案,在async IO中包含一些信息:) – Corbin 2012-03-13 06:06:22

1

PHP通過在執行任何腳本之前將整個文件保存在服務器上的臨時目錄中來處理文件上傳(因此您可以從頭開始使用$ _FILES),並且可以安全地假定所有函數都是同步的 - 即,PHP將等待每一行執行,然後再移至下一行。

+0

但「執行」不總是一個代名詞爲「成功執行」 - 除非像你說的,我可以假設,PHP需要在任何情況下護理的.. – 2012-03-13 06:03:57

+0

可能是錯的,但我不相信副本( )在複製時創建文件的臨時副本。也許你假設提問者正在談論上傳的文件?如果是這樣,可能應該使用move_uploaded_file,而我不相信這就是她所說的。 – Corbin 2012-03-13 06:09:02

+0

是的我假設它與文件上傳和'move_uploaded_file'有關,但它也適用於'copy()'函數(參見http://au.php.net/manual/en/function.copy.php )。這兩個函數都會返回複製操作的狀態,直到複製完成(成功或失敗)纔會返回。因此它們是同步的。 – 2012-03-13 06:11:52