Issue
I have the following code:
function makedirs($dirpath, $mode = 0775, $recursive = true) {
return is_dir($dirpath) || mkdir($dirpath, $mode, $recursive);
}
$dir = 'path/to/folder/';
makedirs($dir, 0775);
The problem is: even when passing 0775 or anything else as parameter for $mode
, mkdir()
creates 0755 permition folders.
For exemple the previows code will return:
- path/ (0755)
- to/ (0755)
- folder/ (0755)
Solution
You could do the following
function makedirs($dirpath, $mode = 0775, $recursive = true) {
$oldMask=umask(002);
$status = is_dir($dirpath) || mkdir($dirpath, $mode, $recursive);
umask($oldMask);
return $status;
}
$dir = 'path/to/folder/'
makedirs($dir, 0775);
Note : Although you could use umask(0) to allow even 777 permissions It's not recommended as it could pose security issues.
Edit
Try setting the umask value system wide for all users or for yourself to remove the umask code from php. Although the above code would work, setting umask in php scripts is not recommended.
According to the PHP Manual Page
Avoid using this function in multithreaded webservers. It is better to change the file permissions with chmod() after creating the file. Using umask() can lead to unexpected behavior of concurrently running scripts and the webserver itself because they all use the same umask.
You can setup umask in /etc/bashrc or /etc/profile file for all users. By default most Linux distro set it to 0022 (022) or 0002 (002). Open /etc/profile or ~/.bashrc file, enter:
# vi /etc/profile
OR
$ vi ~/.bashrc
Append/modify following line to setup a new umask:
umask 022
Save and close the file. Changes will take effect after next login. All UNIX users can override the system umask defaults in their /etc/profile file, ~/.profile (Korn / Bourne shell) ~/.cshrc file (C shells), ~/.bash_profile (Bash shell) or ~/.login file (defines the user’s environment at login).
Source http://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html
Answered By - user3425867 Answer Checked By - David Marino (WPSolving Volunteer)