2015-02-28 25 views
5

Wiem, że jest to typowy błąd z wieloma wątkami, ale jestem zmęczony poszukiwaniem i nadal go nie rozwiązałem. Gdy próbuję uruchomić funkcję file_put_contents pojawia się następujący błąd:Nie można otworzyć strumienia w file_put_contents w PHP na CentOS 7

Warning: file_put_contents(test.txt): failed to open stream: Permission denied in /var/www/html/nurses/adminWriter.php on line 29 

już robiłem najczęściej odpowiedź, zmienić uprawnienia do pielęgniarek folderu oraz test.txt plik do 777. To nie zadziałało.

Obecnie jestem na świeżej instalacji najnowszego serwera CentOS 7.

Znalazłem, że jeśli uruchomić skrypt php w konsoli:

# php /var/www/html/nurses/adminWriter.php 

To działa dobrze, pojawia się błąd podczas uruchamiania go tylko za pośrednictwem przeglądarki, ale naprawdę trzeba go uruchomić tą drogą.

Pozdrawiamy!

+1

Po uruchomieniu skryptu php za pomocą apache, działa on jako (bez względu na użytkownika), często "apache". Kiedy uruchamiasz skrypt php za pomocą konsoli, uruchamiasz go jako cokolwiek jesteś zalogowany jako. Upewnij się, że użytkownik "apache" (lub cokolwiek) ma dostęp do tego pliku (który zawiera katalogi nadrzędne). Możesz też spróbować użyć bezwzględnej ścieżki do pliku test.txt - możesz próbować pisać gdzieś, czego się nie spodziewasz. – jedwards

+0

Pominąłeś cytat według celu? Spróbuj tego: 'file_put_contents (__ DIR__. '/test.txt');' – alfallouji

+0

Masz na myśli coś takiego: # chown -R apache: apache/var/www/html/nurses/ – danielnovais92

Odpowiedz

4

Ok, znalazłem problem: SELinux

Oto rozwiązanie: http://kb.sp.parallels.com/en/11142

W przypadku, gdy strona idzie w dół:

Objawy

Po zmianie domyślnego katalogu do przechowywania treści na stronie (powiedzmy, "/ home"), nie możesz uzyskać dostępu do zawartości subdomen i dodatkowych stron internetowych przez Internet.

Przyczyna

Ten problem występuje, jeśli SELinux pracuje w trybie "Enforcement". W tym trybie katalogi webroot dla witryn i subdomen w nich mają różne uprawnienia, a serwer internetowy nie ma do nich dostępu. Uruchomić polecenie:

# getenforce 

Wyjście powinno być: egzekwowania

Rozdzielczość

Wyłącz SELinux wsparcie: Otwórz plik /etc/selinux/config w dowolnym edytorze i znajdź ten wiersz:

SELINUX=<value> 

go zmienić na:

SELINUX=disabled 

Jeśli nie możesz znaleźć tego pliku, otwórz plik/boot/grub/grub.conf w dowolnym edytorze i dodać parametr SELinux = 0 do Grub Boot Loader:

title SE-Linux Test System 
root (hd0,0) 
kernel /boot/vmlinuz-2.4.20-selinux-XXXXXXXXXX ro root=/dev/hda1 nousb selinux=0 
#initrd /boot/initrd-2.4.20-selinux-XXXXXXXXXX.img 

Reboot serwer, aby zastosować zmiany. Jeśli nie chcesz, aby ponownie uruchomić polecenie:

# setenforce 0 
+1

Wyłączenie SELinux nie jest zalecane. Są lepsze sposoby na zrobienie tego. –

+1

@Ilia Rostovtsev Wpadłem na ten sam problem, i wyłączenie go naprawiło SELinux, jakie inne lepsze sposoby robienia tego bez wyłączania SELinux? – technomage

9
chcon -Rv --type=httpd_sys_rw_content_t /dir 

To może pomóc, zamiast wyłączyć SELinux.

+1

Czy możesz wyjaśnić, co to jest, proszę? – Mike

+0

dziękuję 'aureport -a' przed uruchomieniem chcon {{{ 24. 09-10-2017 16:25:31 httpd system_u: system_r: httpd_t: s0 2 plik odczyt unconfined_u: object_r: user_home_t: s0 denied 923 25. 09-10-2017 16:26:42 httpd system_u: system_r: httpd_t: s0 2 plik odczyt unconfined_u: object_r: user_home_t: s0 denied 924 26. 09-10-2017 16:29:38 httpd system_u: system_r: httpd_t: s0 2 plik read unconfined_u: object_r: user_home_t: s0 denied 925 }}} –

+0

Ten działał dla mnie. U zaoszczędziłem czas po pracy przez wiele godzin. użyj sudo chcon -Rv --type = httpd_sys_rw_content_t/dir – Vara