PHP mkdir: İzin verilmedi sorunu


99

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?


2
Platform / web sunucusu / işletim sistemi?
Salman A

1
şu soruyu kontrol edin: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Aynı sorunu yaşıyordum ve buradaki cevap sorunumu çözdü. Linux üzerinde çalışıyorsanız, SELinux hakkındaki yanıt sizin için geçerli olabilir.
Lucas Madureira

Yanıtlar:


174

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

  1. 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

  2. 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


3
İyi cevap! Umarım bu, zaman içinde sayfanın en üstüne çıkacaktır!
Highly Irregular


Apache'nin önbellek ve günlükler gibi şeyler yazmak için izne ihtiyacı var ... bu sadece ince ayar meselesi.
Manatax

@simpleengine Merhaba Cevabınızı fark ettim .. CodeIgnter'da oluşturmaya çalıştığım ve Ubuntu 14.14 Lts'de geliştirdiğim bir projede aynı problemle karşılaşıyorum .. Yapmam gereken adımları bana biraz daha açıklar mısınız? bu hatayı düzeltmek için ne yapmalı ??? Size biraz ek bilgi vermek gerekirse: mutlak yol /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. ..
ltdev

7
Bunu yapmanın güvenli yolunu göstermeden "güvensiz" demeye devam eden kullanıcıları sevmiyorum.
Cedric Ipkiss

38

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/*

6
Bu çözüm işe yarar, ancak Apache'nin, birisi kötü amaçlı kod çalıştırması durumunda (örneğin, Shellshock güvenlik açığından yararlanma yoluyla) sisteminize zarar vermesine izin verir. Bir alternatif, Apache'yi çalıştırmaya bırakmak _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.
Chris Middleton

3
sadece bu cevabın kötü bir fikir olduğunu yeniden vurgulamak için giriyorum. apache süreçlerinin kendi özel amaçlı kullanıcıları tarafından sahiplenilmesinin pek çok iyi nedeni vardır.
danyamachine

16

PHP'de mkdir kullanırken izinleri 777'ye ayarlamayın

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.


9

Dizinin izinlerini Fix Eğer bir dizin oluşturmayı deneyin içinde .


Dosya izinlerini Filezilla kullanarak özyinelemeli olarak 755'e değiştirerek orijinal sorudaki sorunu çözdüm. 755 izinleri ayarlamanın uygun olduğu bir tür genel dosya havuzu klasörü olduğunu varsayarak ana klasöre sağ tıklayın, ardından Dosya Öznitelikleri -> Sayısal Değer -> 755, ardından "Alt dizinlere tekrar et" seçeneğini işaretleyin. Çok fazla dosyanız varsa, alt dizinlerde yayılması birkaç dakika sürer. Sonra tekrar deneyin.
TARKUS

7

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);
}

?>

1
Yeni bir ana bilgisayara (mysqlnd lol sahip) aktarılırken başıma geldi. Yeni tam ana dizin yoluna geçmeyi unuttum. Aslında bir izin sorunu olmadığı ortaya çıktı.
JSG

2

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


14
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 :)
KingCrunch

1
Dünyanın işletim sistemine erişimi varsa, elbette. Daha iyi bir yol şu olabilir: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig

Veya izinleri olduğu gibi bırakın ve www verilerini ana dizinin grubuna ekleyin.
Marc B

0

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ı.


5
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)
Elias Van Ootegem

Kullanıcı adı nasıl bulunur? www-data gibi mi? Nginx kullanıyorum ama çalışmıyorum
robspin

1
@robspin bunu deneyin: ps aux | egrep '(nginx)'
maxwells

0

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

0

Ş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:

  1. Hedef klasörünüzü nasıl adlandırdığınızı kontrol edin, örneğin: new_folder (bazen bu, çoğu ana bilgisayar çalışma zamanında alt çizgi, kısa çizgi, vb. Kullanan adların oluşturulmasına izin vermediğinden, izin için hataya neden olabilir). Benim için çalıştı.
  2. 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ı.


3
777 bir güvenlik sorunudur
MaicolBen

Az önce düzenlendi, 0755
arungisyadi

0

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

0

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);
            }
        }
    }
}

0

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


0

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 !!

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.