為什麼在伺服器上php裡執行file_put_contents建立檔案返回是false呢,檔案目錄已經設定為777的許可權了,不解

來源:互聯網
上載者:User
想用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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.