|
|
 |
chmod (PHP 3, PHP 4, PHP 5) chmod -- Changes file mode Descriptionbool chmod ( string filename, int mode )
Attempts to change the mode of the file specified by
filename to that given in
mode.
Note that mode is not automatically
assumed to be an octal value, so strings (such as "g+w") will
not work properly. To ensure the expected operation,
you need to prefix mode with a zero (0):
The mode parameter consists of three octal
number components specifying access restrictions for the owner,
the user group in which the owner is in, and to everybody else in
this order. One component can be computed by adding up the needed
permissions for that target user base. Number 1 means that you
grant execute rights, number 2 means that you make the file
writeable, number 4 means that you make the file readable. Add
up these numbers to specify needed rights. You can also read more
about modes on Unix systems with 'man 1 chmod' and 'man 2 chmod'.
Returns TRUE on success or FALSE on failure.
Note:
The current user is the user under which PHP runs. It is
probably not the same user you use for normal shell or FTP
access.
Note: This function will not work on
remote files as the file to
be examined must be accessible via the servers filesystem.
Note:
When safe mode is enabled, PHP
checks whether the files or directories you are about to operate on have
the same UID (owner) as the script that is being executed. In addition,
you cannot set the SUID, SGID and sticky bits
See also chown() and
chgrp().
User Contributed Notes
chmod
aleksej at t2 dot lv
21-Apr-2005 03:34
An easier way to chmod file in local directory:
<?php
chmod( dirname(__FILE__).'/'.'filename.any', 0777 );
?>
To chmod in directory one level below:
<?php
chmod( dirname(__FILE__).'/../'.'filename.any', 0777 );
?>
aleksej at t2 dot lv
15-Apr-2005 04:40
Needed to chmod file in the same directory. After a day of tries opened Google and it helped :)
<?
chmod( substr( $_SERVER['SCRIPT_FILENAME'], 0, strrpos( $_SERVER['SCRIPT_FILENAME'], '/' ) ).'/'.'filename.any', 0777 );
?>
computerguru at spymac dot com
07-Apr-2005 05:05
alex at feidesign dot com
01-Apr-2005 06:20
If you cannot chmod files/directories with PHP because of safe_mode restrictions, but you can use FTP to chmod them, simply use PHP's FTP-functions (eg. ftp_chmod or ftp_site) instead. Not as efficient, but works.
info at rvgate dot nl
02-Feb-2005 07:12
When using ftp_rawlist, in order to get the chmod number from the attributes, i use this code:
<?php
function chmodnum($mode) {
$realmode = "";
$legal = array("","w","r","x","-");
$attarray = preg_split("//",$mode);
for($i=0;$i<count($attarray);$i++){
if($key = array_search($attarray[$i],$legal)){
$realmode .= $legal[$key];
}
}
$mode = str_pad($realmode,9,'-');
$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
$mode = strtr($mode,$trans);
$newmode = '';
$newmode .= $mode[0]+$mode[1]+$mode[2];
$newmode .= $mode[3]+$mode[4]+$mode[5];
$newmode .= $mode[6]+$mode[7]+$mode[8];
return $newmode;
}
?>
some examples:
drwxr-xr-x => 755
drwxr-xr-x => 755
dr-xr-xr-x => 555
drwxr-xr-x => 755
drwxr-xr-x => 755
drwxr-xr-x => 755
drwxr-xr-x => 755
drwxrwxrwt => 776
drwxr-xr-x => 755
drwxr-xr-x => 755
lrwxrwxrwx => 777
used some of already posted code...
tom at NOSPAM dot NO dot SPAM dot darlingpet dot com
10-Jan-2005 03:57
If you are having difficulty with your script setting the permissions of a file, make sure that you are actually trying to set the permissions of the file you want.
For example, you have to get the full root path to the file in order for it to work.. This applies to unix boxes.
<?php
if(!chmod(dirname($_SERVER['SCRIPT_FILENAME'])."/". $file,0777)){echo "Can't chmod $file";}
?>
haasje at welmers dot net
27-Nov-2004 02:09
For recursive chmod'ing see the function below.
Only really usefull when chmod'ing a tree containing directories only, jet, since you don't want an executable bit on a regular file. Who completes the function so it's accepting strings like "g+w", and it's as usefull as unix "chmod -R" ? ;-)
<?php
function chmod_R($path, $filemode) {
if (!is_dir($path))
return chmod($path, $filemode);
$dh = opendir($path);
while ($file = readdir($dh)) {
if($file != '.' && $file != '..') {
$fullpath = $path.'/'.$file;
if(!is_dir($fullpath)) {
if (!chmod($fullpath, $filemode))
return FALSE;
} else {
if (!chmod_R($fullpath, $filemode))
return FALSE;
}
}
}
closedir($dh);
if(chmod($path, $filemode))
return TRUE;
else
return FALSE;
}
?>
PerfectWeb
22-Nov-2004 09:58
As noted by others below... 1) you cannot pass a string to chmod() as the mode, and 2) decimals work as well as octals for the mode.
If you need to come up with the mode on the fly (maybe based on user input) and want to use something like:
$mode = '0'.$owner.$group.$public;
you can use your $mode (which is a string) with chmod like this:
<?php
$mode = '0'.$owner.$group.$public;
$mode_dec = octdec($mode); chmod($filename, $mode_dec);
?>
fernando at gym-group dot com
12-Nov-2004 09:10
about chmod,
Problably you have a local server to simulate your scripts before upload them to the server. No matter if you use Apache under windows or IIS , a chmod instruction like chmod($filename,O777) may not work because windows does not handle that kind of permission's format.
So being in your local server, if you have a only read file and you try to erase, it will show that you dont have permissions even when you have already executed your chmod instrucction correctly. Just up the script it must work well in your internet server if it is a linux machine
sobre chmod,
Probablemente usas un servidor local para probar tus scripts antes de subirlos al servidor en internet. No importa si usas Apache bajo windows o IIS, una instruccion como chmod(nombre_archivo,O777) podrá no trabajar por que windows no maneja esa estructura para definir los permisos.
Estando en tu servidor local, si tienes un archivo de solo lectura y tratas de borrarlo, se mostrará un error diciendo que no tienes permisos aún despúes de haber ejecutado chmod correctamente. Sube tu script, si tu servidor es una máquina linux, el script trabajará sin problemas en internet.
Fernando Yepes C.
Oliver Hankeln
01-Jul-2004 10:21
Well, you don't need octals.
You need a value that can easily computed and remembered if printed in octal.
511 (decimal) is the same as 777 (octal).
So it's the same wether you write
chmod("foo",511)
or
chmod("foo",0777)
The latter is just better readable.
raven_25041980 at yahoo dot com
24-May-2004 12:45
If you have a mode as a string, chmod will insanely mess up your permissions. Instead of using
<?php
@chmod($file_or_dir_name, $mode);
?>
use
<?php
@chmod(file_or_dir_name, intval($mode, 8));
?>
where 8 -> the base to convert into. You need octals, baby, for chmod...
More on intval here: http://www.php.net/manual/en/function.intval.php
agrenier at assertex dot com
02-Apr-2004 07:17
If you find that chmod does not work on your file and that a new file cannot be created, first try to chmod the directory where the file is being created to 0666/0777. Then PHP should be able to write/append files with mode 0644.
agrenier at assertex dot com
02-Apr-2004 07:11
This function will chmod a $filename before writing to it if:
1 - It exists
2 - It is not writeable
3 - PHP has permission to chmod files
If PHP can't chmod, then the script will end. Otherwise it will attempt to write to a new file.
<?php
function file_write($filename, $flag, &$content) {
if (file_exists($filename)) {
if (!is_writable($filename)) {
if (!chmod($filename, 0666)) {
echo "Cannot change the mode of file ($filename)";
exit;
};
}
}
if (!$fp = @fopen($filename, $flag)) {
echo "Cannot open file ($filename)";
exit;
}
if (fwrite($fp, $content) === FALSE) {
echo "Cannot write to file ($filename)";
exit;
}
if (!fclose($fp)) {
echo "Cannot close file ($filename)";
exit;
}
}
?>
Jazeps Basko
27-Jan-2004 09:37
To convert 'rwxr-xr--' to a number representation of chmod, i use this:
<?php
function chmodnum($mode) {
$mode = str_pad($mode,9,'-');
$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
$mode = strtr($mode,$trans);
$newmode = '';
$newmode .= $mode[0]+$mode[1]+$mode[2];
$newmode .= $mode[3]+$mode[4]+$mode[5];
$newmode .= $mode[6]+$mode[7]+$mode[8];
return $newmode;
}
?>
pmichaud at pobox dot com
19-Apr-2003 05:45
In the previous post, stickybit avenger writes:
Just a little hint. I was once adwised to set the 'sticky bit', i.e. use 1777 as chmod-value...
Note that in order to set the sticky bit on a file one must use '01777' (oct) and not '1777' (dec) as the parameter to chmod:
<?php
chmod("file",01777); chmod("file",1777); ?>
Rule of thumb: always prefix octal mode values with a zero.
sticky bit avenger
12-Mar-2003 05:30
Just a little hint. I was once adwised to set the 'sticky bit', i.e. use 1777 as chmod-value. Do NOT do this if you don't have root privileges. When 'sticky bit' is set ONLY the fileuser can delete it afterwards, typically 'httpd' or something like that in case of an upload-script for example. I was unaware of this and actually had to make a script for deleting these files as I could not do this from ftp/ssh even though I did have read/write/execute access to both files and folders. Use simply '0777' or similiar.
Half-Dead at nospam dot com
08-Nov-2002 04:42
[Editor's note:
That is due the fact Win32 systems treat premissions. You do not really have any other levels but read-only.
Maxim]
On WinME with apache chmod also works to a certain limit.
What happens is that apparently only the first number is counted, so 0666 (read-write) is the same as 0777, 0644, 0600, etc, and 0444 (read-only) is the same as 477, 400, etc.
..didn't test 0500 series
FF7Cayn at gmx dot de
27-Oct-2001 07:09
It does work on Windows.
I use Win 98 with the Sambar Server.
The only chmods allowed are the 775 and 666 mod. 775 for non-writeable and 666 for writeable. The only thing is that the usergroups doesn't work.
Note: the 0 at the start doesn't work with windows. use only the decimal kind.
Have fun :)
jon at zend dot com
15-Oct-2001 10:37
if 'mode' is held in a variable and is and octal value you need to convert it to decimal before passing it to the function:
chmod ($filename, octdec($mode))
gnettles2 at home dot com
24-Aug-2001 01:20
Usually when you're trying to write to af file, you'll need to chmod the file to something like 666 or 755. You can use a command to chmod the file for you, which is especially useful when you're making a script where you're setting it up so that your users don't have to peform a bunch of actions to setup the script. When i wrote my news program script, I only had two files. install.php and config.php. All you had to do was chmod install.php to 666 and open it up in a web browser and answer a few questions. The script itself setup the rest of the files and chmodded them for you.
| |