想用file_get_contents讀取網路上的圖片檔案並由file_put_contesnts寫入到伺服器本地,file_get_contesnts執行沒問題,可以讀取資訊,然後將讀出的資料$data執行:
var_dump(file_put_contents($local_file_position, $data));在測試中會顯示var_dump出的資訊,但最後file_put_contents返回是false,不知道為什麼,在網上搜說是aparche沒有寫入權限,是這樣的嗎?如果是,如何設定呢?
環境:CentOS 6.5 + MySQL5.5.35 + tomcat7.0.47
回複討論(解決方案)
補充一下,要寫入的檔案所在路徑的許可權已經設定為777
用的是絕對路徑還是相對路徑?
絕對路徑和相對路徑是一樣的
先確認file_get_contents()擷取的資料是否存在,資料類型是否合法。
這個已經確認資料是存在的,資料就是字串,即使我用fopen 和fwrite也是存在問題。
估計是許可權不夠
echo substr(sprintf('%o', fileperms('你的目錄')), -4); //看看是什麼結果
絕對路徑和相對路徑是一樣的
要求能寫入的話 檔案所在的目錄也是需要有寫的許可權的
比如 /home/centos/123.txt
目錄home、centos也都是需要寫的許可權的不只是單單123.txt需要寫入權限
估計是許可權不夠
echo substr(sprintf('%o', fileperms('你的目錄')), -4); //看看是什麼結果
返回0755
估計是許可權不夠
echo substr(sprintf('%o', fileperms('你的目錄')), -4); //看看是什麼結果
我修改成了777,執行返回:
0777
file_put_contents 失敗時會有明確的錯誤資訊輸出
請貼出
php檔案t.php放在目錄(絕對路徑)/usr/local/www/wxtest
$fp=fopen('txt/test.txt', 'wb');
if($fp) fwrite($fp, "TESTSETST");
else echo "fail to create file.
";
fclose($fp);
?>
在windows瀏覽器地址直接輸入該php檔案
執行結果如下:
Warning: fopen(txt/test.txt): failed to open stream: Permission denied in /usr/local/www/wxtest/t.php on line 87 fail to create file.
Warning: fclose() expects parameter 1 to be resource, boolean given in /usr/local/www/wxtest/t.php on line 90
提示很清楚了,
Permission denied
拒絕訪問
你是要把檔案寫到 /usr/local/www/wxtest/txt 目錄中
請檢查目錄存在且可寫
目錄的許可權已經設定成了777許可權。
並且防止上級目錄許可權不足,我把/usr/local/www/wxtest/txt所有目錄都設定成了755,都包含寫入權限,還是不行。
1. 755許可權指的是 rwxr-xr-x, 同組和其他使用者是沒有寫入權限的。 777才是全部使用者擁有所有許可權。
2. 建議使用絕對路徑,寫檔案前在指令碼內判斷路徑是否存在,不存在則先建立路徑(目錄)再寫檔案,這個是血淋淋的教訓。
1. 755許可權指的是 rwxr-xr-x, 同組和其他使用者是沒有寫入權限的。 777才是全部使用者擁有所有許可權。
2. 建議使用絕對路徑,寫檔案前在指令碼內判斷路徑是否存在,不存在則先建立路徑(目錄)再寫檔案,這個是血淋淋的教訓。
許可權修改為 777 也不行啊。路徑肯定是存在的。
把/usr/local/www/wxtest/txt設成777
把/usr/local/www/wxtest/txt設成777
把/usr/local/www/wxtest/txt設成777
已經設定成了777
是不是apache裡面還有需要設定的,或是系統裡面那個地方還需要設定?
確定是對組外使用者的許可權是777?
確定是對組外使用者的許可權是777?
組外使用者不就是other組嗎?你指的是什嗎?
呵呵,解決了,結貼,謝謝各位的幫忙!
呵呵,解決了,結貼,謝謝各位的幫忙!
怎麼解決的 可否分享下
呵呵,解決了,結貼,謝謝各位的幫忙!
怎麼解決的 可否分享下
預設下selinux是開啟的
查看SELinux狀態:
1、/usr/sbin/sestatus -v ##如果SELinux status參數為enabled即為開啟狀態
SELinux status: enabled
2、getenforce ##也可以用這個命令檢查
關閉SELinux:
1、臨時關閉(不用重啟機器):
setenforce 0 ##設定SELinux 成為permissive模式
##setenforce 1 設定SELinux 成為enforcing模式
2、修改設定檔需要重啟機器:
修改/etc/selinux/config 檔案
將SELINUX=enforcing改為SELINUX=disabled
重啟機器即可
另外,如果以上還是不能解決的話要設定一下目錄的權限原則
chcon -R -t httpd_sys_content_t /home/html