file_put_contents - akış açılamadı: İzin reddedildi


100

Hata ayıklamak için bir dosyaya sorgu yazmaya çalışıyorum. Dosya içeride database/execute.php. Yazmak istediğim dosya database/queries.php.

Kullanmaya çalışıyorum file_put_contents('queries.txt', $query)

Ama alıyorum

file_put_contents (queries.txt) [function.file-put-content]: akış açılamadı: İzin reddedildi

queries.txt777'ye chmod'd dosyası var, sorun ne olabilir?


php.iniDosya erişimini engelleyebilecek herhangi bir şey için dosyaya baktınız mı ?
Hello71

2
ayrıca dizinin doğru chmod'd olduğundan emin olun
Crayon Violent

1
ayrıca mutlak dosya adını kullanmayı deneyin. Şu anki klasör hakkındaki yorumunuz
PHP'lerden

1
Bu chmod durumunu tekrar kontrol edebilir misin?
Jonah

1
Bu tür sorunlar için bir sorun giderme kontrol listesi vardır: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

Yanıtlar:


73

Dizin izinlerini ayarlamayı deneyin.

bir terminalden çalıştırın chmod 777 database(veritabanı klasörünü içeren dizinden)

apache ve doğru chmodd'lanmışsa bu dizine hiç kimse erişemeyecektir.

Yapılacak diğer şey echo "getcwd ()" dir. Bu size mevcut dizini gösterecektir ve eğer bu '/something.../database/' değilse, o zaman 'query.txt'yi sunucunuzun tam yolu olarak değiştirmeniz gerekecektir.


107
777 bir güvenlik riski değil mi?
hitautodestruct

12
Hedef dizinin yalnızca sunucu hesabı tarafından yazılabilir olması değil, aynı zamanda hedef dizinin her ana dizininin sunucu hesabının bu dizine girmesine izin vermesi gerektiğinden kesinlikle şüpheleniyorum; Bunun izinlere + x olacağını düşünüyorum.
Erhannis

2
Erhannis'in teorilerini yeni bir LAMP yığını üzerinde denedim ve teori doğru.
thotheolh

4
@MajidFouladpour Sanırım chmod +x /parent/directory, hedefin her üst dizini için. chmod +x /parent/directory, chmod +x /parentvb.
Erhannis

1
Artık bu tür sorunlar için bir sorun giderme kontrol listesi var: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

19

Diğer seçenek

yapabileceğin mi Apache (www-data), klasörün sahibi

sudo chown -R www-data:www-data /var/www

bu file_put_contentsşimdi işe yaramalı. Ancak daha fazla güvenlik için aşağıdaki gibi izinleri de ayarlamanız daha iyi olur

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • /var/wwwphp dosyalarınızın kök klasörüne değiştirin

7

Bunun artık oldukça eski olduğunu anlayın, ancak böyle bir dosyaya manuel olarak sorgu yazmaya gerek yok. MySQL, yerleşik günlük kaydı desteğine sahiptir, yalnızca geliştirme ortamınızda etkinleştirmeniz gerekir.

'Genel sorgu günlüğü' belgelerine bir göz atın:

http://dev.mysql.com/doc/refman/5.1/en/query-log.html


4

Bu bağlantı yığınından bilgi toplama -görüntü kaydetme chmod 777 ile çalışmıyor save'dan bilgi toplamak ve azerafati ve Loek Bergman kullanıcısından çalışmıyor

/ etc / apache / envvars dosyasının altına bakacak olursanız, şöyle bir şey göreceksiniz:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache, 'www-data' kullanıcı adı altında çalıştırılır.

"0755", dosya sahibinin okuyabileceği / yazabileceği / çalıştırabileceği, ancak grup ve diğer kullanıcıların yazamayacağı anlamına gelir. bu yüzden ur terminalinde, 'resimler' klasörünüzü içeren klasöre cd yapın. sonra şunu yazın:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

sahibi değiştirmeden önce yetkileri değiştirmelisiniz. istendiğinde şifrenizi girin. bu görüntü klasörünün 'www-data' sahibi yapacaktır.

yüklemeniz şimdi çalışmalıdır.


3

Çocuklar 1 aydır bu sorunu yaşadım ve her şeyi yaptım ama düzeltemedim, ama şimdi çözümü biliyorum.

Paylaşımlı bir linux barındırma kullanıyorum, yöneticim php'yi 5.3 olarak değiştirdiğinde "file_put_contents" kodu için birçok hata aldım. planımı test etmeyi dene:

Sunucunuzda mytest.php gibi bir dosya oluşturun ve bu kodu yerleştirin ve kaydedin:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Bir kez "www.your-domain.com/mytest.php" URL'sini açın ve ardından e-postanızı kontrol edin. mytest.php'ye girdiğiniz bilgilerle barındırıcınızdan bir e-posta almanız gerekir, gönderenin adını kontrol edin. onun dan eğer Kimse bir şey tanımlanmadı çünkü "Reddedilen İzin" hakkında sorun var ve gönderenin adı benim id gibi ise: iietj8qy@hostname5.netly.net Eğer prob yok.

Yöneticim sunucuyu değiştirdi ve ana bilgisayarı tekrar kurdu sanırım ve sorun çözüldü, ana bilgisayar yönetiminize size söylediklerimi söyleyin ve belki de cevabı bulurlar.

umarım sana yardımcı olur!


Tamamen kayboldum !! Ne demeye çalışıyorsun? Apache kullanıcısının sunucudaki ana bilgisayar adını alamadığını söylüyorsanız (paylaşılan veya her neyse), o zaman bir barındırma hizmeti seçiminizi yeniden gözden geçirmenin tam zamanıdır.
Fr0zenFyr

3

Bunun çok eski bir soru olduğunu biliyorum, ancak iyi çözümü derinlemesine bir açıklama ile eklemek istedim. Ubuntu benzeri sistemlerde iki ifade yürütmeniz gerekecek ve sonra bir cazibe gibi çalışacak.

Linux'ta izinler üç basamakla gösterilebilir. İlk hane, dosyaların sahibinin iznini tanımlar. İkinci basamak, belirli bir kullanıcı grubunun izinlerini belirtir. Üçüncü hane, grubun sahibi veya üyesi olmayan tüm kullanıcılar için izinleri tanımlar.

Web sunucusunun grubun bir üyesi olan bir id ile çalışması beklenir. Web sunucusu, dosya ve dizinlerin sahibiyle asla aynı kimlik ile çalışmamalıdır. Ubuntu'da www-data kimliği altında apache çalıştırır. Bu kimlik, izinlerin belirtildiği grubun bir üyesi olmalıdır.

Dosyaların içeriğini değiştirmek istediğiniz dizine uygun hakları vermek için şu ifadeyi yürütün:

find %DIR% -type d -exec chmod 770 {} \;

Bu, OP sorusunda,% ROOT% / veritabanı dizini için izinlerin buna göre değiştirilmesi gerektiği anlamına gelir. Bu nedenle, o dizinde asla değiştirilmemesi veya kaldırılmaması gereken dosyalara sahip olmamak önemlidir. Bu nedenle, içeriğinin değiştirilmesi gereken dosyalar için ayrı bir dizin oluşturmak en iyi uygulamadır.

Bir dizin için okuma izinleri (4), tüm dosya ve dizinleri meta verileriyle birlikte bir dizin içinde toplayabilmek anlamına gelir. Yazma izinleri (2) dizinin içeriğini değiştirme izni verir. Dosya ekleme ve kaldırma, izinleri değiştirme vb. İma etmek. Yürütme izni (1), o dizine girme hakkına sahip olduğunuz anlamına gelir. İkincisi olmadan dizinin daha derinlerine inmek imkansızdır. Bir dosyanın içeriğinin değiştirilmesi gerektiğinde, web sunucusunun okuma, yazma ve yürütme izinlerine ihtiyacı vardır. Bunun için grubun 7 rakamına ihtiyacı var.

İkinci ifade, OP'nin sorusundadır:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

Bir belgeyi okuyup yazabilmek gerekir, ancak dosyayı yürütmek gerekli değildir. Dosyaların sahibine 7, gruba 6 verilir. Web sunucusunun içeriğini değiştirmek için dosyayı yürütme iznine sahip olması gerekmez. Bu yazma izinleri yalnızca o dizindeki dosyalara verilmelidir.

Diğer tüm kullanıcılara herhangi bir izin verilmemelidir.

Dosyalarının değiştirilmesi gerekmeyen dizinler için 5 grup izinleri yeterlidir. İzinler ve bazı örneklerle ilgili belgeler:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/


1

Ubuntu kullanan ve sayfayı yerel olarak yüklerken bu hatayı alan ancak bir web barındırma hizmetinde olmayan herkes için,

Bunu nautilus'u ( sudo nautilus) açarak ve açmaya çalıştığınız dosyaya sağ tıklayarak, özellikler> Ayarlar'a tıklayarak ve 'diğer herkese' okuma yazma izni vererek düzelttim.


1

Git'ten yerelden sunucuya çekiyorsanız, bazen önbelleği / veya diğer önbelleğe alınmış dosyalar ile birlikte yüklendiği görünüm dosyaları nedeniyle önbelleği temizlemeniz gerekir.

php artisan cache:clear

Bazen, uygulamanız git çekme işleminden önce çalışıyor olsaydı, sadece hile olabilir


Evet, görüş: temiz benim için çalıştı. Neden böyle bir hatanın bu kadar sık ​​ortaya çıktığını bilmiyorum!
Douglas Hosea

0

aynı sorunu yaşadı; benim sorunum selinux'un zorlamaya ayarlanmasıydı.

777'ye chmoding yaptıktan ve tüm ana klasörlerin apache kullanıcısı için yürütme izinlerine sahip olduğundan emin olduktan sonra bile "akış açılamadı: İzin reddedildi" hatasını almaya devam ettim. Sorunumun selinux'un zorlamak için ayarlanması (centos7'deyim) olduğu ortaya çıktı, bu bir devbox, bu yüzden onu kapattım.


0

Bu, aşağıdaki adımlarla çözülebilir:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Umarım yardımcı olur


0

bu yardımcı olabilir. Benim için çalıştı. terminalde dene

setenforce 0


-3

İşte çözüm. Bir URL'den bir img kopyalamak için. bu URL:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

istenen yolu oluştur, adı ile bitir .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

-3

Bu sorunları çözmenin 2 yolu var
1. kullanın chmod 777 path-to-your-directory.
işe yaramazsa,
2. dosyanızın tam yolunu girmeniz yeterlidir query.txt.


2
Bu korkunç derecede güvensiz ve son derece kötü bir uygulamadır. Özel uygulamalar geliştirirken tespit edilmesi ve düzeltilmesi de zordur ve kolayca gözden kaçabilir. Lütfen doğru izinleri gerçekten belirleyin.
ftrotter

-11

Ayrıca, içinde file_put_contents man pagebelirtildiği gibi php.net, adlandırma sorunlarına dikkat edin.

file_put_contents($dir."/file.txt", "hello");

çalışmayabilir (sözdiziminde doğru olsa bile), ancak

file_put_contents("$dir/file.txt", "hello");

İşler. Bunu php yüklü farklı sunucularda yaşadım.


17
Bu doğru değil. bir dizge olduğu varsayılarak tüm durumlarda $dir."/file.txt"işlevsel olarak eşdeğerdir . Dahası, bu davranış Kivanc'ın iddia ettiği gibi php.net'te belgelenmemiştir. "$dir/file.txt"$dir
mattbasta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.