ftp_site() 函数用于向 FTP 服务器发送 SITE 命令。
SITE 命令允许执行特定于 FTP 服务器的操作,这些操作通常不是标准 FTP 协议的一部分。不同的 FTP 服务器支持不同的 SITE 命令,具体取决于服务器的配置和实现。
ftp_site ( resource $ftp_stream , string $command ) : bool
| 参数 | 类型 | 描述 |
|---|---|---|
$ftp_stream |
resource | 必需的。FTP 连接的标识符,由 ftp_connect() 或 ftp_ssl_connect() 返回。 |
$command |
string | 必需的。要发送到 FTP 服务器的 SITE 命令字符串。 |
如果命令成功发送,返回 true;如果失败,返回 false。
注意:返回 true 只表示命令已成功发送到服务器,不表示命令本身执行成功。某些服务器可能会返回错误响应,但函数仍可能返回 true。
以下是一些常见的 SITE 命令示例,但实际支持的命令取决于 FTP 服务器软件:
| 命令 | 描述 |
|---|---|
SITE CHMOD 644 filename |
更改文件权限(在 Unix/Linux 服务器上常见) |
SITE HELP |
列出服务器支持的 SITE 命令 |
SITE UMASK 022 |
设置文件创建时的默认权限掩码 |
SITE ZIP ON/OFF |
启用或禁用压缩传输 |
SITE IDLE 3600 |
设置空闲超时时间(秒) |
SITE ALIAS name path |
创建目录别名 |
SITE WHO |
显示当前连接的用户 |
SITE STAT |
显示服务器状态信息 |
以下示例展示了如何向 FTP 服务器发送 SITE 命令。
<?php
// 连接 FTP 服务器
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
$conn = ftp_connect($ftp_server);
if (!$conn) {
die("无法连接到 $ftp_server");
}
// 登录
if (!@ftp_login($conn, $ftp_user, $ftp_pass)) {
die("登录失败");
}
// 发送 SITE HELP 命令获取支持的 SITE 命令列表
if (ftp_site($conn, "HELP")) {
echo "SITE HELP 命令发送成功\n";
// 注意:ftp_site() 本身不返回命令的输出
// 要获取输出,可能需要使用 ftp_raw() 或其他方法
} else {
echo "发送 SITE HELP 命令失败\n";
}
// 发送 SITE CHMOD 命令更改文件权限
$filename = "public_html/index.php";
if (ftp_site($conn, "CHMOD 644 $filename")) {
echo "文件权限更改命令已发送: $filename\n";
} else {
echo "发送 CHMOD 命令失败\n";
}
ftp_close($conn);
?>
在实际使用前检查服务器是否支持特定的 SITE 命令。
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
/**
* 检查 FTP 服务器是否支持特定的 SITE 命令
* @param resource $conn FTP 连接
* @param string $site_command 要检查的 SITE 命令
* @return bool 如果服务器可能支持该命令返回 true,否则返回 false
*/
function check_site_command_support($conn, $site_command) {
// 首先尝试获取 SITE HELP 的输出
if (ftp_site($conn, "HELP")) {
// 注意:ftp_site() 不返回命令输出
// 这里只是演示逻辑,实际中可能需要使用其他方法获取输出
// 假设我们通过某种方式获得了 HELP 的输出
// 这里简化处理,实际应用需要更复杂的实现
echo "服务器支持 SITE 命令,但需要查看 HELP 输出确定具体支持的命令\n";
return true; // 假设支持
}
// 如果 SITE HELP 失败,尝试直接发送命令并检查错误
if (ftp_site($conn, $site_command)) {
echo "命令 '$site_command' 发送成功(服务器可能支持)\n";
return true;
} else {
echo "命令 '$site_command' 发送失败(服务器可能不支持)\n";
return false;
}
}
// 检查服务器是否支持 CHMOD 命令
check_site_command_support($conn, "CHMOD");
ftp_close($conn);
?>
一个更完整的示例,展示如何使用 SITE CHMOD 命令。
<?php
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
// 连接并登录
$conn = ftp_connect($ftp_server);
if (!$conn || !@ftp_login($conn, $ftp_user, $ftp_pass)) {
die("FTP 连接或登录失败");
}
// 要更改权限的文件
$files = [
"public_html/index.php",
"public_html/style.css",
"public_html/script.js"
];
// 为每个文件设置权限
foreach ($files as $file) {
// 检查文件是否存在
if (ftp_size($conn, $file) !== -1) {
// 发送 SITE CHMOD 命令
$command = "CHMOD 644 $file";
if (ftp_site($conn, $command)) {
echo "成功发送权限更改命令: $file\n";
} else {
echo "权限更改命令失败: $file\n";
echo "可能原因:服务器不支持 SITE CHMOD 命令\n";
}
} else {
echo "文件不存在: $file\n";
}
}
// 设置目录权限
$directory = "public_html/uploads";
if (@ftp_chdir($conn, $directory)) {
ftp_cdup($conn); // 返回上级目录
if (ftp_site($conn, "CHMOD 755 $directory")) {
echo "目录权限更改成功: $directory\n";
}
} else {
echo "目录不存在或无法访问: $directory\n";
}
ftp_close($conn);
?>
使用 SITE 命令获取服务器状态和信息。
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
// 尝试获取服务器支持的 SITE 命令列表
echo "尝试获取服务器支持的 SITE 命令...\n";
// 发送 SITE HELP 命令
if (ftp_site($conn, "HELP")) {
echo "SITE HELP 命令已发送\n";
echo "注意:要查看实际输出,可能需要使用 ftp_raw() 或启用详细模式\n";
} else {
echo "SITE HELP 命令发送失败\n";
}
// 发送 SITE STAT 命令获取服务器状态
if (ftp_site($conn, "STAT")) {
echo "SITE STAT 命令已发送\n";
}
// 发送 SITE WHO 命令查看当前连接用户
if (ftp_site($conn, "WHO")) {
echo "SITE WHO 命令已发送\n";
}
// 注意:上述命令的输出通常不会通过 ftp_site() 返回
// 要获取实际响应,需要考虑使用其他方法,如:
// 1. 启用 FTP 详细模式
// 2. 使用 ftp_raw() 函数(如果可用)
// 3. 检查服务器日志
ftp_close($conn);
?>
在某些情况下,可能需要使用 ftp_raw() 来获取 SITE 命令的实际响应。
<?php
// 注意:ftp_raw() 函数在某些 PHP 版本中可能不可用
// 这是一个高级示例,展示了如何获取 SITE 命令的实际响应
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
// 检查 ftp_raw() 函数是否可用
if (function_exists('ftp_raw')) {
echo "ftp_raw() 函数可用,可以获取服务器响应\n";
// 使用 ftp_raw() 发送 SITE HELP 命令并获取响应
$response = ftp_raw($conn, "SITE HELP");
if ($response) {
echo "服务器响应:\n";
foreach ($response as $line) {
echo htmlspecialchars($line) . "\n";
}
} else {
echo "获取响应失败\n";
}
} else {
echo "ftp_raw() 函数不可用\n";
echo "尝试使用 ftp_site() 发送命令...\n";
// 回退到使用 ftp_site()
if (ftp_site($conn, "HELP")) {
echo "SITE HELP 命令已发送,但无法获取响应文本\n";
echo "请检查服务器文档或使用其他方法获取命令输出\n";
}
}
ftp_close($conn);
?>
ftp_site() 只返回命令是否成功发送,不返回命令执行的结果或输出。| 问题 | 可能的原因和解决方案 |
|---|---|
| SITE 命令失败 | 服务器不支持该命令。使用 SITE HELP 查看支持的命令列表。 |
| 权限更改不生效 | 服务器可能配置为忽略 CHMOD 命令,或用户没有足够权限。 |
| 无法获取命令输出 | ftp_site() 不返回命令输出。考虑使用 ftp_raw() 或启用 FTP 详细日志。 |
| 命令被忽略 | 某些服务器需要特定配置才能启用 SITE 命令支持。 |
| 连接断开 | 某些 SITE 命令可能导致服务器断开连接,特别是管理命令。 |