Ich versuche, ein Verzeichnis mit der PHP-Funktion mkdir zu erstellen, erhalte jedoch die folgende Fehlermeldung : Warning: mkdir() [function.mkdir]: Permission denied in .... Wie kann man das Problem lösen?
Ich versuche, ein Verzeichnis mit der PHP-Funktion mkdir zu erstellen, erhalte jedoch die folgende Fehlermeldung : Warning: mkdir() [function.mkdir]: Permission denied in .... Wie kann man das Problem lösen?
Antworten:
Ich weiß, dass dies ein alter Thread ist, aber er braucht eine bessere Antwort. Sie sollten die Berechtigungen nicht auf 777 setzen müssen, da dies ein Sicherheitsproblem darstellt, da es Lese- und Schreibzugriff auf die Welt ermöglicht. Möglicherweise verfügt Ihr Apache-Benutzer nicht über Lese- / Schreibberechtigungen für das Verzeichnis.
Hier ist, was Sie in Ubuntu tun
Stellen Sie sicher, dass alle Dateien der Apache-Gruppe und dem Benutzer gehören. In Ubuntu ist es die WWW-Datengruppe und der Benutzer
chown -R www-data:www-data /path/to/webserver/www
Als nächstes konnten alle Mitglieder der WWW-Datengruppe Dateien lesen und schreiben
chmod -R g+rw /path/to/webserver/www
Die PHP- mkdir()Funktion sollte jetzt funktionieren, ohne Fehler zurückzugeben
/opt/lampp/htdocs/www/my-app/public/uploads.. Grundsätzlich versuche ich, dass jeder angemeldete Benutzer Dateien in den Upload-Ordner hochlädt und auch Album-Ordner erstellt (dies wird mit PHP durchgeführt), um Fotos zu speichern ..
Späte Antwort für Leute, die dies in Zukunft über Google finden. Ich bin auf das gleiche Problem gestoßen.
HINWEIS: Ich bin auf MAC OSX LION
Was passiert ist, dass Apache als Benutzer "_www" ausgeführt wird und keine Berechtigung zum Bearbeiten von Dateien hat. Sie werden feststellen, dass KEINE Dateisystemfunktionen über PHP funktionieren.
Wie repariert man:
Öffnen Sie ein Finder-Fenster und wählen Sie in der Menüleiste Gehe> Gehe zu Ordner> / private / etc / apache2
Öffnen Sie jetzt httpd.conf
finden:
User _www
Group _www
Ändern Sie den Benutzernamen:
User <YOUR LOGIN USERNAME>
Starten Sie nun Apache neu, indem Sie dieses Formular-Terminal ausführen:
sudo apachectl -k restart
Wenn es immer noch nicht funktioniert, mache ich Folgendes, bevor ich das oben genannte getan habe. Könnte verwandt sein.
Öffnen Sie das Terminal und führen Sie die folgenden Befehle aus: (Beachten Sie, dass sich meine Webserver-Dateien unter / Library / WebServer / www befinden. Ändern Sie sie entsprechend dem Standort Ihrer Website.)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwund eine Gruppe für Sie und Apache zu erstellen. Bilden Sie eine neue Gruppe, sagen Sie angerufen trusted, und setzen Sie sich und _wwwin sie. Machen Sie dann den Gruppeneigentümer aller Dateien in Ihrem Serverdokumentenverzeichnis als vertrauenswürdig. Führen Sie schließlich chmod g+rwxnur die Dateien aus, auf die Apache Zugriff benötigt, damit die trustedGruppe die Berechtigung zum Bearbeiten der Dateien hat.
Nur-Link-Antworten gelten in StackOverflow nicht als bewährte Methode, aber die hier gegebenen Ratschläge sollten im Allgemeinen NICHT befolgt werden.
Ich möchte auf diese großartige Antwort auf eine ähnliche Frage zurückkommen . Ich zitiere:
Bitte hören Sie auf, die Verwendung von 777 vorzuschlagen. Sie machen Ihre Datei für alle beschreibbar, was bedeutet, dass Sie die gesamte Sicherheit verlieren, für die das Berechtigungssystem entwickelt wurde. Wenn Sie dies vorschlagen, denken Sie über die Konsequenzen nach, die dies für einen schlecht konfigurierten Webserver haben kann: Es würde unglaublich einfach werden, die Website durch Überschreiben der Dateien zu "hacken". Also nicht.
Befestigen Sie die Berechtigungen des Verzeichnisses versuchen Sie ein Verzeichnis erstellen in .
Ich weiß, dass dieser Thread alt ist, aber vielleicht hilft das eines Tages jemandem.
Das Problem, warum PHP "Berechtigung verweigert" für mkdir () sagt - falscher URL-Pfad. Um das Problem zu beheben, müssen Sie lediglich den richtigen Pfad ermitteln. Ich habe es so gemacht:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Sie benötigen die Dateisystemberechtigung, um das Verzeichnis zu erstellen.
Beispiel: In Ubuntu 10.04 läuft Apache (PHP) als Benutzer: www-data in Gruppe: www-data
Das heißt, der Benutzer www-data benötigt Zugriff, um das Verzeichnis zu erstellen.
Sie können dies selbst versuchen, indem Sie 'su www-data' verwenden, um der Benutzer von www-data zu werden.
Als schnelle Lösung können Sie Folgendes tun: sudo chmod 777 my_parent_dir
chmod 0777wird Lese- und Schreibzugriff auf die Welt geben! Sie sollten so etwas nicht empfehlen. Allerdings ist der Rat mit der Benutzergruppe derzeit der beste hier :)
Was Sie auch tun können, ist: / etc / sudoers
Fügen Sie dort die folgende Zeile hinzu, die diesem Benutzer die Berechtigung erteilt. Www-data ALL = (ALL: ALL) ALL Warum www-data? Dies liegt daran, dass Apache unter diesem Benutzernamen ausgeführt wird.
Falls Ihr Benutzer anders ist, versuchen Sie es mit dem Benutzernamen ALL = (ALL: ALL) ALL
Das hat bei mir funktioniert.
sudoersdirekt, sondern melden Sie sich als root an und verwenden Sie den visudoBefehl te : Er überprüft alle Änderungen, um fehlerhafte Änderungen zu vermeiden. Dies kann zu Analysefehlern führen, wenn die sudoers-Datei geladen wird, wodurch Sie möglicherweise machtlos werden (wie bei keinen Rechten an) etwas ändern)
Da Sie auf einem Mac arbeiten, können Sie sich der Gruppe _www (Apache-Benutzergruppe) auf Ihrem Mac hinzufügen:
sudo dseditgroup -o edit -a $USER -t user _www
und fügen Sie _www user zur Radgruppe hinzu. Dies scheint das zu sein, was der Mac als Dateien erstellt:
sudo dseditgroup -o edit -a _www -t user wheel
Ich habe dieses Problem gerade. Meine beste Lösung, die ich Ihnen derzeit geben kann (obwohl Sie keinen Ihrer Codes angegeben haben), wäre:
Wenn Sie den rekursiven Befehl zum Erstellen von Unterordnern verwendet haben, vergessen Sie nicht, 0755 (denken Sie daran, 0 am Anfang einzufügen) in den Befehl mkdir einzufügen, z.
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}Das funktioniert jetzt auch bei mir.
Wenn Sie LINUX verwenden, überprüfen wir zunächst den Benutzer von Apache, da dies in einigen Distributionen unterschiedlich sein kann:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Angenommen, das Ergebnis ist "http". Führen Sie die folgenden Schritte aus. Denken Sie daran, path_to_folder in Ordnerpfad zu ändern:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
Überprüfen Sie, ob es kein Problem mit umask ist
if (!function_exists('mkdir_r')) {
/**
* create directory recursively
* @param $dirName
* @param int $rights
* @param string $dir_separator
* @return bool
*/
function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
$dirs = explode($dir_separator, $dirName);
$dir = '';
$created = false;
foreach ($dirs as $part) {
$dir .= $part . $dir_separator;
if (!is_dir($dir) && strlen($dir) > 0) {
$created = mkdir($dir, $rights);
}
}
return $created;
}
}
if (!function_exists('ensure_dir')) {
/**
* ensure directory exist if not create
* @param $dir_path
* @param int $mode
* @param bool $use_mask
* @param int $mask
* @return bool
*/
function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
// set mask
$old_mask = $use_mask && $mask != null
? umask($mask)
: null;
try {
return is_dir($dir_path) || mkdir_r($dir_path, $mode);
} finally {
if ($use_mask && $old_mask != null) {
// restore original
umask($old_mask);
}
}
}
}
Nachdem Sie den FTP-Server mit installiert sudo apt-get install vsftpdhaben, müssen Sie ihn konfigurieren. Um den Schreibzugriff zu aktivieren, müssen Sie die /etc/vsftpd.confDatei bearbeiten und das auskommentieren
#write_enable=YES
Zeile, so sollte es lesen
write_enable=YES
Speichern Sie die Datei und starten Sie vsftpdmit neu sudo service vsftpd restart.
Weitere Konfigurationsoptionen finden Sie in dieser Dokumentation oderman vsftpd.conf
Dieser Fehler tritt auf, wenn Sie den falschen Pfad verwenden.
Zum Beispiel:
Ich verwende das Ubuntu-System und mein Projektordnername lautet "myproject".
Angenommen, ich habe das Verzeichnis myproject / public / report und möchte einen neuen Ordner mit dem Namen " orders" erstellen
Dann brauche ich einen ganzen Weg, auf dem mein Projekt existiert. Sie können den Pfad per PWD-Befehl abrufen
Mein Root-Pfad lautet also = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Es wird für dich funktionieren !! Genießen !!