略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: ftp_chmod

2024-11-13

ftp_chmod

(PHP 5, PHP 7, PHP 8)

ftp_chmod设置 FTP 服务器上的文件权限

说明

ftp_chmod(resource $ftp_stream, int $mode, string $filename): int

将服务器上的文件权限设置为 mode 指定的值。

参数

ftp_stream

FTP 连接标示符。

mode

要设置的权限值, 八进制 值。

filename

远程文件名称。

返回值

操作成功返回文件新的权限,操作失败返回 false

范例

示例 #1 ftp_chmod() 函数例程

<?php
$file 
'public_html/index.php';

// 建立基础连接
$conn_id ftp_connect($ftp_server);

// 使用用户名和密码登录
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass);

// 尝试设置 $file 的权限为 644
if (ftp_chmod($conn_id0644$file) !== false) {
 echo 
"$file chmoded successfully to 644\n";
} else {
 echo 
"could not chmod $file\n";
}

// 关闭连接
ftp_close($conn_id);
?>

参见

add a noteadd a note

User Contributed Notes 7 notes

up
2
Maarten Wolzak
12 years ago
Using the excellent octdec and decoct functions you can make this easy:

<?php
$mode
= "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
up
0
DanN
12 years ago
Just wanted to contribute a quick note for those who are still experiencing issues with changing the permissions via FTP.

If you are having trouble with PHP recognizing the mode as an integer, you can take the previous poster's method:

$mode = octdec ( str_pad ( $mode, 4, '0', STR_PAD_LEFT ) );

And add the following snippet right after:

$mode = (int) $mode;

This will force PHP to recognize the mode as an integer when you do:

ftp_chmod ( $conn_id, $mode, $path );

These together never seem to fail for me.
up
0
rperea at vsourceweb dot com
13 years ago
It took me a while to figure out how to use this function in my situation because I needed the $mode to be passed to this function as a variable that was read from a database. Since the database returns the value as an integer without a leading zero, I could not get the operation to work because adding a leading zero in PHP turns the value into a string.

For example, this does not work in my situation:

<?php
// Assume that this is the value returned from the database.
$mode = 644;

// Now try to chmod using this value.
ftp_chmod($conn_id, $mode, 'test.txt');

// The file now has permissions of 204 and not 644
?>

Adding a leading zero doesn't work either:

<?php
// Assume that this is the value returned from the database.
$mode = 644;

// Now try to chmod using this value.
ftp_chmod($conn_id, '0'.$mode, 'test.txt');

// The file now has permissions of 204 and not 644
?>

I tried many ways to get it to work even converting it from oct to dec using octdec and then back to decoct and nothing worked. This is the only way I was able to get it to work, with an eval statement.

<?php
// Assume that this is the value returned from the database.
$mode = 644;

// Turn the mode into a string
$np = '0'.$mode;

// Now run chmod with the eval'd string parsed as an integer.
ftp_chmod($conn_id, eval("return({$np});"), 'test.txt');

// The file now has permissions of 644
?>

Of course, you will have to make sure that the value of $mode only contains 3 digits. Always do checking on your values before handing it off to eval().
up
0
tiefenbrunner at obdev dot at
14 years ago
The "mode" parameter of the PHP5 ftp_chmod function is an integer value that is supposed to be given as an octal number, like the argument for the "chmod" command line tool.

Thus the sprintf must use the %o formatting character, so that the passed integer value is really represented as an octal number to the CHMOD site command for the FTP server.

So, IMHO, rabin's version is correct (it definitely worked for me).
up
-1
cspiegl at kwask dot de
14 years ago
Ok,
so if 2 people say that my way is wrong and the other is right, i will take mine back.
I posted it cause for me just the way i used it worked (i don't know why)

AND: i would not say something like: "I would try before post", in my opinion that is realy unfriendly, cause i tryed!
up
-1
rabin at rab dot in
16 years ago
As mentioned in the note below, the function posted by "hardy add mapscene dot com" works incorrectly if used with an octal mode, the way the php5 function is used.

This function works exactly like the the php5 one:

<?php
if (!function_exists('ftp_chmod')) {
    function
ftp_chmod($ftp_stream, $mode, $filename)
    {
        return
ftp_site($ftp_stream, sprintf('CHMOD %o %s', $mode, $filename));
    }
}
?>
up
-2
Josh at jcr dot com
14 years ago
rabin's code works just fine as a replacement for ftp_chmod().
I would try that before trying cspiegl's solution for pre-php 5 installations.

官方地址:https://www.php.net/manual/en/function.ftp-chmod.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3