mkdir() 不能创建远程目录,因其仅支持 file:// 等本地协议,ftp://、sftp://、http:// 等不实现 mkdir 逻辑;应改用 ftp_mkdir()、ssh2_sftp_mkdir() 或 cURL 调用 API。

PHP 的 mkdir() 函数**不能用于创建远程目录**,即使启用了 URL 封装协议(如 ftp:// 或 sftp://),它也**不支持通过 URL 创建远程路径上的目录**。
为什么 mkdir() 无法用 URL 创建远程目录
虽然 PHP 手册提到自 5.0.0 起 mkdir() “也可用于某些 URL 封装协议”,但这个说法有严格限制:
- 该支持仅适用于 本地文件系统封装协议,例如
file://—— 实际仍是操作本地磁盘; -
ftp://、http://、sftp://等协议并未实现 mkdir() 的写入逻辑,调用会直接失败并触发E_WARNING; - PHP 内置的流封装器中,只有极少数扩展(如某些 FTP 扩展)可能提供目录创建能力,但它们不通过
mkdir()函数暴露,而是使用专用 API。
实际可行的替代方案
若需在远程服务器(如 FTP/SFTP)上创建目录,应改用对应协议的原生方法:
-
FTP 服务器:使用
ftp_mkdir()(需已建立 FTP 连接):$conn = ftp_connect("ftp.example.com");<br> ftp_login($conn, "user", "pass");<br> ftp_mkdir($conn, "/remote/path/newdir"); -
SFTP 服务器:使用
ssh2_sftp_mkdir()(需ssh2扩展):$sftp = ssh2_sftp($connection);<br> ssh2_sftp_mkdir($sftp, "/remote/path/newdir", 0755, true);
-
WebDAV 或 HTTP 目标:标准 HTTP 协议本身不支持“创建目录”,需依赖后端 API(如 REST 接口)发送
POST或PROPPATCH请求,PHP 中可用cURL实现。
常见误区提醒
以下写法不会成功**,且通常静默失败或报错:
mkdir("ftp://user:pass@ftp.example.com/path/to/dir", 0755, true);mkdir("sftp://user@host/path", 0755);mkdir("http://api.example.com/v1/mkdir?path=xxx");
这些调用会因协议不支持而返回 false,并可能抛出警告(如 Warning: mkdir(): Protocol not supported)。
验证当前环境支持哪些协议
可运行以下代码查看已注册的流封装器:
print_r(stream_get_wrappers());
结果中即使看到 ftp 或 http,也不代表它们支持 mkdir() —— 它们只保证 fopen()、file_get_contents() 等读取类操作可用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











