Die Berechtigung file_put_contents wurde verweigert

97

Ich versuche, eine Abfrage zum Debuggen in eine Datei zu schreiben. Die Datei ist in database/execute.php. Die Datei, in die ich schreiben möchte, ist database/queries.php.

Ich versuche zu benutzen file_put_contents('queries.txt', $query)

Aber ich bekomme

file_put_contents (queries.txt) [function.file-put-content]: Stream konnte nicht geöffnet werden: Berechtigung verweigert

Ich habe die queries.txtDatei chmod'd auf 777, was könnte das Problem sein?

Hagelholz
quelle
Haben Sie die php.iniDatei nach etwas durchsucht, das den Dateizugriff verweigern könnte?
Hallo71
2
Stellen Sie auch sicher, dass das Verzeichnis richtig ist
Crayon Violent
1
Versuchen Sie auch, den absoluten Dateinamen zu verwenden. Es kann sein, dass Ihre Interpretation des aktuellen Ordners sich von der von PHP unterscheidet
laher
1
Können Sie diesen chmod-Status noch einmal überprüfen?
Jonah
1
Es gibt eine Checkliste zur Fehlerbehebung für diese Art von Problemen: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

Antworten:

72

Versuchen Sie, die Verzeichnisberechtigungen anzupassen.

Führen Sie auf einem Terminal aus chmod 777 database(aus dem Verzeichnis, das den Datenbankordner enthält).

Apache und niemand wird Zugriff auf dieses Verzeichnis haben, wenn es korrekt geändert wurde.

Das andere, was zu tun ist, ist das Echo "getcwd ()". Dies zeigt Ihnen das aktuelle Verzeichnis an. Wenn dies nicht "/something.../database/" ist, müssen Sie "query.txt" in den vollständigen Pfad für Ihren Server ändern.

Jason
quelle
104
Ist 777 nicht ein Sicherheitsrisiko?
Hitautodestruct
12
Ich vermute sehr, dass nicht nur das Zielverzeichnis vom Serverkonto beschreibbar sein muss, sondern dass jedes übergeordnete Verzeichnis des Zielverzeichnisses dem Serverkonto die Navigation ermöglichen muss. Ich denke das wäre + x für die Berechtigungen.
Erhannis
2
Ich habe Erhannis 'Theorien an einem neuen LAMP-Stack experimentiert und die Theorie ist richtig.
Thotheolh
4
@MajidFouladpour Ich denke chmod +x /parent/directory, für jedes übergeordnete Verzeichnis des Ziels. chmod +x /parent/directory, chmod +x /parentEtc.
Erhannis
1
Es gibt jetzt eine Checkliste zur Fehlerbehebung für diese Art von Problemen: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew
18

Die andere Option

ist, dass Sie machen können Apache (www-data), der Besitzer des Ordners

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

das sollte file_put_contentsjetzt funktionieren. Für mehr Sicherheit sollten Sie jedoch auch die folgenden Berechtigungen festlegen

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • Wechseln Sie /var/wwwin den Stammordner Ihrer PHP-Dateien
Azerafati
quelle
7

Beachten Sie, dass dies jetzt ziemlich alt ist, aber es ist nicht erforderlich, Abfragen manuell in eine Datei wie diese zu schreiben. In MySQL ist die Protokollierungsunterstützung integriert. Sie müssen sie nur in Ihrer Entwicklungsumgebung aktivieren.

Schauen Sie sich die Dokumentation zum 'allgemeinen Abfrageprotokoll' an:

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

Adam
quelle
3

Leute, ich hatte dieses Problem 1 Monat lang und habe alles getan, konnte es aber nicht beheben, aber jetzt kenne ich die Lösung.

Ich verwende ein Shared Linux Hosting. Als mein Administrator die PHP auf 5.3 änderte, bekam ich viele Fehler für den Code "file_put_contents". versuche meinen Plan zu testen:

Erstellen Sie in Ihrem Host eine Datei wie mytest.php, geben Sie diesen Code ein und speichern Sie:

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

Öffnen Sie einmal die URL "www.your-domain.com/mytest.php" und überprüfen Sie Ihre E-Mails. Sie sollten eine E-Mail von Ihrem Host mit den Informationen haben, die Sie in mytest.php eingegeben haben. Überprüfen Sie den Absendernamen. Wenn es von niemandem stammt , haben Sie ein Problem mit "Berechtigung verweigert", weil etwas nicht definiert ist, und wenn der Absendername meiner ID entspricht: [email protected], haben Sie kein Problem.

Mein Administrator hat den Server geändert und den Host erneut installiert. Ich denke, das Problem wurde behoben. Sagen Sie Ihrer Host-Administration, was ich Ihnen gesagt habe, und vielleicht finden sie die Antwort.

hoffe es hilft dir!

Hesam
quelle
Ich bin völlig verloren !! Was versuchst du zu sagen? Wenn Sie sagen, dass der Apache-Benutzer den Hostnamen nicht auf dem Server abrufen konnte (freigegeben oder was auch immer), ist es höchste Zeit, die Wahl eines Hosting-Dienstes zu überdenken.
Fr0zenFyr
3

Ich weiß, dass es eine sehr alte Frage ist, aber ich wollte die gute Lösung mit einigen ausführlichen Erklärungen hinzufügen. Sie müssen zwei Anweisungen auf Ubuntu-ähnlichen Systemen ausführen, und dann funktioniert es wie ein Zauber.

Berechtigungen unter Linux können dreistellig dargestellt werden. Die erste Ziffer definiert die Erlaubnis des Eigentümers der Dateien. Die zweite Ziffer gibt die Berechtigungen einer bestimmten Benutzergruppe an. Die dritte Ziffer definiert die Berechtigungen für alle Benutzer, die weder Eigentümer noch Mitglied der Gruppe sind.

Der Webserver soll mit einer ID ausgeführt werden, die Mitglied der Gruppe ist. Der Webserver sollte niemals mit derselben ID wie der Eigentümer der Dateien und Verzeichnisse ausgeführt werden. In Ubuntu läuft Apache unter der ID www-data. Diese ID sollte Mitglied der Gruppe sein, für die die Berechtigungen angegeben sind.

Führen Sie die folgende Anweisung aus, um dem Verzeichnis, in dem Sie den Inhalt von Dateien ändern möchten, die richtigen Rechte zu geben:

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

Dies würde in der Frage des OP bedeuten, dass die Berechtigungen für das Verzeichnis% ROOT% / database entsprechend geändert werden sollten. Es ist daher wichtig, keine Dateien in diesem Verzeichnis zu haben, die niemals geändert oder entfernt werden sollten. Es wird daher empfohlen, ein separates Verzeichnis für Dateien zu erstellen, deren Inhalt geändert werden muss.

Leseberechtigungen (4) für ein Verzeichnis bedeuten, dass alle Dateien und Verzeichnisse mit ihren Metadaten in einem Verzeichnis erfasst werden können. Schreibberechtigungen (2) geben die Berechtigung zum Ändern des Inhalts des Verzeichnisses. Das Hinzufügen und Entfernen von Dateien, das Ändern von Berechtigungen usw. Die Ausführungsberechtigung (1) bedeutet, dass Sie das Recht haben, in dieses Verzeichnis zu wechseln. Ohne Letzteres ist es unmöglich, tiefer in das Verzeichnis einzudringen. Der Webserver benötigt Lese-, Schreib- und Ausführungsberechtigungen, wenn der Inhalt einer Datei geändert werden soll. Dafür braucht die Gruppe die Ziffer 7.

Die zweite Aussage betrifft die Frage des OP:

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

Das Lesen und Schreiben eines Dokuments ist erforderlich, die Ausführung der Datei ist jedoch nicht erforderlich. Die 7 wird dem Eigentümer der Dateien gegeben, die 6 der Gruppe. Der Webserver muss nicht über die Berechtigung verfügen, die Datei auszuführen, um ihren Inhalt zu ändern. Diese Schreibberechtigungen sollten nur für Dateien in diesem Verzeichnis erteilt werden.

Alle anderen Benutzer sollten keine Erlaubnis erhalten.

Für Verzeichnisse, deren Dateien nicht geändert werden müssen, sind Gruppenberechtigungen von 5 ausreichend. Dokumentation zu Berechtigungen und einige Beispiele:

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/

Loek Bergman
quelle
3

Das Sammeln von Informationen über diesen Link Stackoverflow-Image Save funktioniert nicht mit chmod 777 und von den Benutzern azerafati und Loek Bergman

Wenn Sie unter der Datei / etc / apache / envvars nachsehen, sehen Sie Folgendes:

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

Apache wird unter dem Benutzernamen 'www-data' ausgeführt.

'0755' bedeutet, dass der Dateibesitzer lesen / schreiben / ausführen kann, aber Gruppen- und andere Benutzer nicht schreiben können. CD in Ihrem Terminal in den Ordner, der Ihren Ordner "images" enthält. Geben Sie dann Folgendes ein:

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

Sie müssen zuerst die Berechtigungen ändern, bevor Sie den Eigentümer wechseln. Geben Sie Ihr Passwort ein, wenn Sie dazu aufgefordert werden. Dadurch wird "www-data" Eigentümer des Bilderordners.

Ihr Upload sollte jetzt funktionieren.

Bruce Tong
quelle
1

Für alle, die Ubuntu verwenden und diesen Fehler beim lokalen Laden der Seite, jedoch nicht bei einem Webhosting-Dienst, erhalten,

Ich habe dies nur behoben, indem ich nautilus ( sudo nautilus) geöffnet und mit der rechten Maustaste auf die Datei geklickt habe, die Sie öffnen möchten. Klicken Sie auf Eigenschaften> Einstellungen> und geben Sie "Alle anderen" Lese- und Schreibzugriff.

d -_- b
quelle
0

hatte das gleiche Problem; Mein Problem war, dass Selinux auf Durchsetzung gesetzt war.

Ich bekam immer wieder den Fehler "Stream konnte nicht geöffnet werden: Berechtigung verweigert", auch nachdem ich auf 777 geändert und sichergestellt hatte, dass alle übergeordneten Ordner Ausführungsberechtigungen für den Apache-Benutzer hatten. Es stellte sich heraus, dass mein Problem darin bestand, dass Selinux auf Durchsetzung gesetzt war (ich bin auf centos7). Dies ist eine Devbox, also habe ich sie deaktiviert.

DaveS
quelle
0

Dies kann mit den folgenden Schritten behoben werden:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Ich hoffe es hilft

7Rust
quelle
0

Wenn Sie von git vom lokalen zum Server ziehen, müssen Sie den Cache manchmal aufgrund der Ansichtsdateien leeren, die mit ihm / oder anderen zwischengespeicherten Dateien hochgeladen werden.

php artisan cache:clear

Manchmal ist es vielleicht nur ein Trick, wenn Ihre Anwendung vor dem Git Pull funktioniert hat

Deepesh Thapa
quelle
0

das könnte helfen. Es hat bei mir funktioniert. versuchen Sie es im Terminal

setenforce 0

Lithin Joseph
quelle
-2

Es gibt zwei Möglichkeiten, um diese Probleme zu beheben:
1. Verwenden Sie chmod 777 path-to-your-directory.
Wenn es nicht funktioniert,
2. geben Sie einfach den vollständigen Pfad Ihrer Datei an query.txt.

Salman Mohammad
quelle
2
Dies ist eine schrecklich unsichere und äußerst schlechte Praxis. Es ist auch schwer zu erkennen und zu korrigieren, wenn benutzerdefinierte Anwendungen entwickelt werden, und kann leicht übersehen werden. Bitte finden Sie tatsächlich die richtigen Berechtigungen heraus.
Ftrotter
-3

Hier die Lösung. So kopieren Sie ein Bild von einer URL. diese URL:http://url/img.jpg

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

Erstellen Sie den gewünschten Pfad und beenden Sie den Namen mit .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)
Masterhoo
quelle
-11

Achten Sie außerdem, wie file_put_contents man pagein erwähnt php.net, auf Namensprobleme.

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

funktioniert möglicherweise nicht (obwohl es in der Syntax korrekt ist), aber

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

funktioniert. Ich habe dies auf verschiedenen PHP-installierten Servern erlebt.

Kivanc
quelle
17
Das ist nicht richtig. $dir."/file.txt"ist "$dir/file.txt"in allen Fällen funktional äquivalent zu , vorausgesetzt, es $dirhandelt sich um eine Zeichenfolge. Darüber hinaus ist dieses Verhalten nicht auf php.net dokumentiert, wie Kivanc behauptet.
Mattbasta