使用優秀的 octdec 和 decoct 函式,您可以輕鬆完成此操作
<?php
$mode = "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
(PHP 5, PHP 7, PHP 8)
ftp_chmod — 透過 FTP 設定檔案權限
成功時返回新的檔案權限,失敗時返回 false
。
版本 | 說明 |
---|---|
8.1.0 | ftp 參數現在需要一個 FTP\Connection 實例;先前需要一個 資源。 |
範例 #1 ftp_chmod() 範例
<?php
$file = 'public_html/index.php';
// 設定基本連線
$ftp = ftp_connect($ftp_server);
// 使用使用者名稱和密碼登入
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);
// 嘗試將 $file 的權限設定為 644
if (ftp_chmod($ftp, 0644, $file) !== false) {
echo "$file 的權限已成功設定為 644\n";
} else {
echo "無法設定 $file 的權限\n";
}
// 關閉連線
ftp_close($ftp);
?>
使用優秀的 octdec 和 decoct 函式,您可以輕鬆完成此操作
<?php
$mode = "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
提供給那些仍在透過 FTP 變更權限時遇到問題的人一個快速提示。
如果您在 PHP 將模式識別為整數方面遇到問題,您可以採用前面發文者的方法
$mode = octdec ( str_pad ( $mode, 4, '0', STR_PAD_LEFT ) );
並在後面加上以下程式碼片段
$mode = (int) $mode;
當您執行以下程式碼時,這會強制 PHP 將模式識別為整數
ftp_chmod ( $conn_id, $mode, $path );
這些加在一起對我來說從來沒有失敗過。
我花了一段時間才弄清楚如何在自己的情況下使用這個函式,因為我需要將從資料庫讀取的變數 $mode 傳遞給這個函式。由於資料庫傳回的值是一個沒有前導零的整數,我無法讓操作正常運作,因為在 PHP 中新增前導零會將值轉換為字串。
例如,這在我的情況下不起作用
<?php
// 假設這是從資料庫傳回的值。
$mode = 644;
// 現在嘗試使用此值 chmod。
ftp_chmod($conn_id, $mode, 'test.txt');
// 檔案現在的權限是 204 而不是 644
?>
新增前導零也不起作用
<?php
// 假設這是從資料庫傳回的值。
$mode = 644;
// 現在嘗試使用此值 chmod。
ftp_chmod($conn_id, '0'.$mode, 'test.txt');
// 檔案現在的權限是 204 而不是 644
?>
我嘗試了許多方法讓它運作,甚至使用 octdec 將其從八進位轉換為十進位,然後再轉換回 decoct,但都沒有用。這是我唯一能讓它運作的方法,使用 eval 陳述式。
<?php
// 假設這是從資料庫返回的值。
$mode = 644;
// 將模式轉換為字串
$np = '0'.$mode;
// 現在使用 eval() 評估的字串(解析為整數)來執行 chmod。
ftp_chmod($conn_id, eval("return({$np});"), 'test.txt');
// 檔案現在的權限為 644
?>
當然,您必須確保 $mode 的值僅包含 3 位數字。在將值傳遞給 eval() 之前,務必先檢查您的值。
PHP5 ftp_chmod 函數的「mode」參數是一個整數值,應該以八進位數字的形式提供,就像「chmod」命令列工具的參數一樣。
因此,sprintf 必須使用 %o 格式化字元,以便傳遞的整數值確實以八進位數字的形式呈現給 FTP 伺服器的 CHMOD 站點命令。
所以,依我拙見,rabin 的版本是正確的(它確實對我有效)。
如下方註釋所述,如果以八進位模式使用「hardy add mapscene dot com」發布的函數,就像 php5 函數的使用方式一樣,則該函數會運作不正確。
此函數的運作方式與 php5 函數完全相同
<?php
if (!function_exists('ftp_chmod')) {
function ftp_chmod($ftp_stream, $mode, $filename)
{
return ftp_site($ftp_stream, sprintf('CHMOD %o %s', $mode, $filename));
}
}
?>
好的,
所以如果兩個人說我的方法是錯的,而另一個人的方法是對的,我會收回我的說法。
我發布它是因為我使用它的方式有效(我不知道為什麼)
還有:我不會說「我會在發布前嘗試」之類的話,在我看來,這真的很不友善,因為我嘗試過了!
rabin 的程式碼作為 ftp_chmod() 的替代方案可以正常運作。
在嘗試使用 cspiegl 的解決方案來處理 PHP 5 之前的安裝之前,我會先嘗試這個方法。