PHP mkdir işlevi ile bir dizin oluşturmak çalışıyorum ama şöyle bir hata alıyorum: Warning: mkdir() [function.mkdir]: Permission denied in .... Sorun nasıl çözülür?
PHP mkdir işlevi ile bir dizin oluşturmak çalışıyorum ama şöyle bir hata alıyorum: Warning: mkdir() [function.mkdir]: Permission denied in .... Sorun nasıl çözülür?
Yanıtlar:
Bunun eski bir konu olduğunu biliyorum ama daha iyi bir cevaba ihtiyacı var. İzinleri 777 olarak ayarlamanıza gerek yoktur, bu bir güvenlik sorunudur çünkü dünyaya okuma ve yazma erişimi sağlar. Apache kullanıcınızın dizin üzerinde okuma / yazma izinleri olmayabilir.
İşte Ubuntu'da yaptıklarınız
Tüm dosyaların Apache grubuna ve kullanıcısına ait olduğundan emin olun. Ubuntu'da www-veri grubu ve kullanıcısıdır
chown -R www-data:www-data /path/to/webserver/www
Daha sonra, www veri grubunun tüm üyelerinin dosyaları okuyup yazmasını sağladı
chmod -R g+rw /path/to/webserver/www
Php mkdir()işlevi artık hata vermeden çalışmalıdır
/opt/lampp/htdocs/www/my-app/public/uploads.. Temel olarak yapmaya çalıştığım şey, her oturum açmış kullanıcının karşıya yüklemeler klasörüne dosya yüklemesi ve ayrıca fotoğrafları depolamak için albüm klasörleri (bu php ile yapılacak) oluşturmasıdır. ..
Bunu gelecekte google üzerinden bulan kişiler için geç cevap. Ben de aynı problemle karşılaştım.
NOT: MAC OSX LION'DAYIM
Olan şey, apache'nin "_www" kullanıcısı olarak çalıştırılması ve herhangi bir dosyayı düzenleme iznine sahip olmamasıdır. HİÇBİR dosya sistemi işlevinin php aracılığıyla çalışmadığını fark edeceksiniz.
Nasıl düzeltilir:
Bir bulucu penceresi açın ve menü çubuğundan Git> Klasöre Git> / private / etc / apache2'yi seçin.
şimdi httpd.conf'u açın
bul:
User _www
Group _www
kullanıcı adını değiştirin:
User <YOUR LOGIN USERNAME>
Şimdi bu form terminalini çalıştırarak apache'yi yeniden başlatın:
sudo apachectl -k restart
Hala işe yaramazsa, yukarıdakileri yapmadan önce aşağıdakileri yapıyorum. İlişkili olabilir.
Terminali açın ve aşağıdaki komutları çalıştırın: (web sunucusu dosyalarımın / Library / WebServer / www konumunda bulunduğunu unutmayın. Web sitenizin konumuna göre değiştirin)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwve siz ve Apache için bir grup oluşturmaktır. Yeni bir grup oluşturun, arayın deyin trustedve kendinizi ve _wwwiçine koyun. Ardından, sunucu belgeleri dizininizdeki tüm dosyaların grup sahibine güvenin. Son olarak, grubun dosyaları düzenleme izni olması chmod g+rwxiçin, yalnızca Apache'nin erişmesi gereken dosyalar üzerinde gerektiği gibi yapın trusted.
Yalnızca bağlantı yanıtları, StackOverflow'da iyi bir uygulama olarak kabul edilmez, ancak burada verilen tavsiye genellikle takip edilmemelidir.
Benzer bir soru için bu harika yanıta dönmek istiyorum . Alıntı yaparım:
Lütfen 777'yi kullanmayı önermeyi bırakın. Dosyanızı herkes tarafından yazılabilir hale getiriyorsunuz, bu da hemen hemen izin sisteminin tasarlandığı tüm güvenliği kaybedeceğiniz anlamına gelir. Bunu önerirseniz, kötü yapılandırılmış bir web sunucusu üzerinde sahip olabileceği sonuçları düşünün: Dosyaların üzerine yazarak web sitesini "hacklemek" inanılmaz derecede kolay hale gelir. Öyleyse, yapma.
Dizinin izinlerini Fix Eğer bir dizin oluşturmayı deneyin içinde .
Bu iş parçacığının eski olduğunu biliyorum, ama belki bir gün bu birine yardımcı olur.
PHP'nin mkdir () için "İzin reddedildi" demesinin sorunu - yanlış url yolu. Yani, düzeltmek için tek ihtiyacınız olan doğru yolu bulmak. Ben şu şekilde yaptım:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Dizini oluşturmak için dosya sistemi iznine sahip olmanız gerekir.
Örnek: Ubuntu 10.04'te apache (php) kullanıcı olarak çalışır: grupta www-verisi: www-verisi
Bu, kullanıcının www verilerinin dizini oluşturmak için erişmesi gerektiği anlamına gelir.
Www-data kullanıcısı olmak için 'su www-data' kullanarak bunu kendiniz deneyebilirsiniz.
Hızlı bir düzeltme olarak şunları yapabilirsiniz: sudo chmod 777 my_parent_dir
chmod 0777dünyaya okuma ve yazma erişimi sağlayacak! Böyle bir şey tavsiye etmemelisin. Ancak, kullanıcı grubu ile tavsiye şu anda burada en iyisidir :)
Yapabileceğiniz diğer şey şu adrese gitmek: / etc / sudoers
Bu kullanıcıya izin veren aşağıdaki satırı ekleyin www-data ALL = (ALL: ALL) ALL Neden www-data? bunun nedeni apache'nin bu kullanıcı adıyla çalışmasıdır.
Kullanıcınız farklıysa kullanıcı adı ALL = (ALL: ALL) ALL deneyin
Bu benim için çalıştı.
sudoersdoğrudan düzenlemeyin , ancak kök olarak oturum açın ve te visudokomutunu kullanın: bu, hatalı düzenlemeleri önlemek için değişiklikleri kontrol eder, bu, sudoers dosyası yüklendiğinde ayrıştırma hatalarına neden olabilir, bu da sizi güçsüz bırakabilir (hiçbir hakta olmadığı gibi) her şeyi değiştir)
Mac'te olduğunuz için, kendinizi mac'inizdeki _www (apache kullanıcı grubu) grubuna ekleyebilirsiniz:
sudo dseditgroup -o edit -a $USER -t user _www
ve mac'un dosyaları şu şekilde oluşturduğu görünen tekerlek grubuna _www kullanıcısını ekleyin:
sudo dseditgroup -o edit -a _www -t user wheel
Şu anda bu sorunu yaşıyorum, şu anda size verebileceğim en iyi çözümüm (kodunuzun hiçbirini eklememiş olmanıza rağmen) şunlar olacaktır:
Alt klasörler oluşturmak için özyinelemeli komut kullanıyorsanız, mkdir komutuna 0755 koymayı unutmayın (başlangıca 0 eklemeyi unutmayın), örneğin:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}
Bu da şimdi benim için çalıştı.
LINUX kullanıyorsanız, önce apache'nin kullanıcısını kontrol edelim, çünkü bazı dağıtımlarda farklı olabilir:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Sonucun "http" olduğunu varsayalım. Aşağıdakileri yapın, sadece klasör yolunu klasörlere değiştirmeyi unutmayın:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
umask ile ilgili bir sorun olup olmadığını kontrol edin
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);
}
}
}
}
Ftp sunucusunu birlikte kurduktan sonra sudo apt-get install vsftpd, onu yapılandırmanız gerekecektir. Yazma erişimini etkinleştirmek için /etc/vsftpd.confdosyayı düzenlemeniz ve
#write_enable=YES
satır, bu yüzden okumalı
write_enable=YES
Dosyayı ve yeniden kaydetme vsftpdile sudo service vsftpd restart.
Diğer yapılandırma seçenekleri için bu belgeye bakın veyaman vsftpd.conf
Yanlış yolu kullanıyorsanız bu hata oluşur.
Örneğin:
Ubuntu sistemini kullanıyorum ve proje klasör adım 'myproject'
Farz edelim myproject / public / report dizinim var ve emirler adında yeni bir klasör oluşturmak istiyorum
O zaman projemin var olduğu bütün bir yola ihtiyacım var. Yolu PWD komutuyla alabilirsiniz
Yani benim kök yolum = '/ home / htdocs / myproject /' olacak
$ dir = '/ home / htdocs / myproject / public / rapor / Siparişler';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Senin için çalışacak !! Zevk almak !!