Mengapa saya gagal membuat folder (di bawah document root) dengan fungsi mkdir() di PHP? Pesan errornya permission denied

Salah satu penyebab adalah Anda masih menjalankan skrip PHP sebagai cgi-USER dan bukan sebagai USER. cgi-USER adalah mekanisme proteksi default di server hosting, agar skrip tidak dapat menulisi document root. Ada 2 solusi: pertama, Anda dapat mengubah setting agar skrip berjalan sebagai USER.

Solusi kedua, Anda menggunakan fasilitas Kelola File di control panel hosting saja untuk membuat folder tersebut. Atau membuat folder induk dulu dari Kelola File lalu mengubah permissionnya menjadi 775. Kini skrip PHP Anda yang berjalan sebagai cgi-USER tetap dapat membuat subfolder di bawah folder induk tersebut. Contoh, Anda membuat dulu lewat Kelola File folder uploads/ yang diset ke 775. Setelah itu skrip Anda kini dapat membuat subfolder mis: uploads/user1/, uploads/user2/, dll.

Mengapa saya tidak bisa membuat folder dengan permission 0777 atau 0775? Kenapa hasilnya menjadi tetap 0775? Sementara membuat yang 0700 atau 0770 atau 0771 bisa.

Fungsi mkdir() di PHP dipengaruhi oleh umask. Umask adalah bit yang harus mati dalam permission file/folder yang baru dibuat. Umask default pada kebanyakan sistem adalah 0022. Ini artinya, permission file/folder yang baru dibuat tidak dapat lebih permisif dari (0777 & 0022 = 0775).

Jika perlu membuat folder atau file yang permissionnya lebih permisif, maka ada 2 cara yang dapat dilakukan:

  • mkdir() diikuti chmod()

Anda dapat melakukan mkdir() diikuti chmod() untuk mengeset permission mode. Contoh:

mkdir("namadir");
chmod("namadir", 0777); 
  • mengubah umask()

Anda juga bisa mengubah umask() dulu menjadi 0.

umask(0);
mkdir("namadir", 0777);

Note: Mode 0777 sangat tidak aman dan biasanya tidak perlu. Harap mempertimbangkan lagi pilihan Anda ini. Jika aplikasi dapat berjalan tanpa mod 0777, maka gunakan saja 0775.

Link/referensi