標籤:
出現的問題描述:
今天在實現一個在使用者註冊時上傳頭像圖片檔案的PHP指令碼時,出現了問題:PHP指令碼在前面已經確定
瀏覽器端上傳檔案沒有錯誤。
上傳的檔案是合法的。
上傳的檔案是影像檔。
已經在伺服器端產生了唯一的檔案名稱。
代碼
接下來我們應該做的就是把檔案從臨時位置移動到固定位置,於是乎我就寫了以下指令碼:
//把檔案從臨時位置移動到固定位置@move_uploaded_file($_FILES[$image_fieldname][‘tmp_name‘], $upload_filename) or handle_error("儲存圖片檔案出錯", "移動檔案出錯" . "{$upload_filename}");
代碼handle_error()函數是我自己定義的錯誤處理函數,當move_uploaded_file函數執行出錯時,就會跳轉到錯誤頁,當我執行執行上面的指令碼時,指令碼跳轉到了錯誤頁,很明顯是出錯了,首先我排查了一下我的函數參數是否出現了錯誤:
$_FILES[$image_fieldname][‘tmp_name‘]$upload_filename //是我自己組合的檔案路徑,保證沒錯
根據PHP 手冊,我傳入函數的上述兩個參數都是能保證沒有問題的,這麼怎麼回事呢,頁面中都沒有報錯(在函數的前面我使用了PHP的“@”運算子,所以頁面才不會報錯)
@運算子
註:在代碼中要慎用PHP的 @ 運算子,
@運算子可以屏蔽掉所有可能來自使用者輸入無效的問題或者SQL查詢包含了一個不正確的列、甚至是一個不規範URL 錯誤都可以避免了,代碼甚至可以不檢查由使用者、自己或帶那產生的錯誤,簡而言之,@運算子可以屏蔽掉代碼的錯誤資訊,一個流行網站經常使用@,因為它們根本不能崩潰或者停止,但是在這種情形下要使用其他解決錯誤的方案。
尋找error log檔案
當時我並沒有意識到@運算子對出錯資訊的屏蔽,我就想去找apache的error log 錯誤記錄檔檔案看看,由於我在搭建PHP開發環境的時候使用的是xampp這樣的開發套件,所以error_log檔案跟網上大部分文章說的不一樣,最終我在
(我的主機是 ubuntu)
/opt/lampp/logs
路徑下找到了php_error_log檔案,當然這個路徑下還存放著apache的error_log檔案,在php_error_log檔案中我看到了出錯問題:許可權不夠,我終於找到了出錯的地方:我們存放圖片的目的目錄對執行PHP的使用者來說是沒有許可權的,執行PHP指令碼的使用者和我寫指令碼代碼、建立圖片檔案夾的使用者不是同一個使用者
其實我們本不用這麼麻煩,我們只要將函數前面的@運算子去掉,然後去掉錯誤處理函數handle_error()函數,然後我們 就可以在web頁面看到出錯資訊了。
修改目標檔案夾許可權
不管怎麼樣,我們還是找到了問題的根源,這是一件很值得高興的事情,既然檔案夾所屬使用者和許可權不對,那麼我們只要修改這些問題即可:
修改圖片固定存放檔案夾的所屬使用者,將其修改為運行apache執行PHP指令碼的使用者。
將檔案夾的許可權改為755
那麼運行apache的使用者是誰呢,我們利用PHP指令碼擷取:
echo exec(‘whoami‘); //獲得執行該檔案的使用者名稱,從而修改圖片檔案夾的許可權
這樣我得到了執行指令碼的使用者為:daemon,你們得到的很可能跟我的不一樣。
下面我們來修改檔案夾的所屬使用者:
chown daemon -R ~/web/hello_php/uploads
~/web/hello_php/uploads是我存放圖片的目標路徑,-R代表遞迴的給這個目錄下的檔案夾修改所屬使用者。
接著修改檔案夾許可權
chmod 775 -R ~/web/hello_php/uploads
這樣我們就大功告成了,
參考閱讀:http://www.manongjc.com/article/1494.html
解決PHP move_uploaded_file函數移動圖片失敗