php创建文件支持ftp路径吗_phpftp路径创文件法【实例】
技术百科
絕刀狂花
发布时间:2026-01-27
浏览: 次 PHP fopen() 不支持直接写 FTP 路径,因默认未启用 FTP 流包装器且不支持带认证的写操作;应使用 ftp_connect() + ftp_fput() 等扩展函数实现可控上传。
PHP fopen() 不支持直接写 FTP 路径
PHP 的 fopen() 默认不识别 ftp:// 或 ftps:// 这类 URL 作为文件路径。你写 fopen("ftp://user:pass@host/path/file.txt", "w") 会失败,报错类似:Warning: fopen(): Unable to find the wrapper "ftp" —— 这说明 PHP 没启用或没配置好 FTP 流包装器(stream wrapper)。
即使启用了,fopen() 对 FTP 写入也受限:它只支持匿名读取(ftp://),不支持带认证的写操作;且多数共享主机禁用 FTP 流包装器,或只读不写。
- FTP 流包装器需编译时启用
--with-ftp(CLI 版通常有,Web SAPI 常被禁用) -
fopen("ftp://...", "w")在绝大多数生产环境会静默失败或抛出警告 - 无法控制被动/主动模式、超时、SSL/TLS 协商等关键参数
用 ftp_connect() + ftp_fput() 才可靠
真正可控、可调试、适配生产环境的方式是显式使用 FTP 扩展函数。先连上,再上传本地临时文件,或用内存流模拟“创建”行为。
例如,想在远程 FTP 目录新建一个 config.json:
$conn = ftp_connect("example.com", 21, 30);
if (!$conn) die("FTP 连接失败");
if (!ftp_login($conn, "user", "pass")) die("FTP 登录失败");
ftp_pasv($conn, true); // 强制被动模式,避免防火墙拦截
// 方法一:写入字符串内容(需先写入临时文件)
$content = '{"env":"prod","debug":false}';
$tempFile = tempnam(sys_get_temp_dir(), 'ftp_');
file_put_contents($tempFile, $content);
if (ftp_put($conn, "/htdocs/config.json", $tempFile, FTP_BINARY)) {
echo "上传成功";
} else {
echo "上传失败";
}
unlink($tempFile); // 删临时文件
ftp_close($conn);
-
ftp_put()和ftp_fput()是唯二支持写入的函数;后者可传资源句柄,适合大文件或动态内容 - 必须调用
ftp_pasv(),否则内网/云主机常因端口限制上传卡住 - 路径用绝对路径(如
/htdocs/xxx),不是相对当前目录 —— FTP 服务器没有“当前工作目录继承”概念
用 ftp_fput() 避免临时文件更干净
如果内容已知(比如 JSON、日志行),可以跳过 tempnam() + file_put_contents(),直接用内存流:
$content = '{"status":"ok","ts":' . time(
) . '}';
$stream = fopen('php://memory', 'r+');
fwrite($stream, $content);
rewind($stream);
if (ftp_fput($conn, "/logs/latest.json", $stream, FTP_BINARY)) {
echo "写入完成";
}
fclose($stream);
-
php://memory是内存中的可读写流,比磁盘临时文件快且无清理风险 - 务必
rewind(),否则ftp_fput()从末尾开始读,传空内容 -
ftp_fput()第三个参数是资源(resource),不是字符串,别传错类型
注意 FTPS、超时和错误捕获
FTP over TLS(FTPS)不是简单改协议名。PHP 的 ftp_connect() 不支持 ftps://,得用 ftp_ssl_connect(),且服务器必须明确支持显式 FTPS(AUTH TLS)。
- 连接超时默认太长(可能卡 90 秒),用
ftp_set_option($conn, FTP_TIMEOUT_SEC, 15)主动设短 - 所有 FTP 函数失败都返回
false,但错误信息不自动抛出,要用error_get_last()或开启ftp_set_option($conn, FTP_AUTOSEEK, false)辅助调试 - 权限问题常见:FTP 用户对目标目录无写权限,或 SELinux / chroot 限制了路径访问,此时
ftp_put()返回false但无具体提示
FTP 路径“创建文件”的本质是上传,不是原子化的新建操作;没有类似 touch 的语义,也没有服务端回调或事件通知。别指望它像本地 fopen() 那样顺滑 —— 每一步都要手动检查返回值,每条路径都要确认权限和存在性。
# 这类
# 第三个
# 都要
# 上传
# 要用
# app
# 不支持
# win
# linux
# 防火墙
# 端口
# js
# json
# stream
# 字符串
# 报错
# 事件
# 继承
# 抛出
# php
# ssl
# 句柄
# fopen
# 临时文件
# Resource
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c# Task.Yield 的作用是什么 它和Ta
- Avalonia如何实现跨窗口通信 Avaloni
- Win11怎么设置DNS服务器_Windows11
- php订单日志怎么记录物流_php记录订单物流变更
- Win11怎么开启远程桌面_Win11系统远程桌面
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- Win11怎么关闭开机声音_Win11系统启动提示
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- C++如何编写函数模板?(泛型编程入门)
- php订单日志怎么按状态筛选_php筛选不同状态订
- Win11局域网共享怎么设置 Win11文件夹网络
- C#怎么创建控制台应用 C# Console Ap
- Win11怎么设置系统还原_Windows11系统
- 如何使用Golang实现RPC序列化与反序列化_G
- 如何在Golang中处理数据库事务错误_回滚和日志
- 如何在Golang中使用log包输出不同级别日志_
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- Python 中将 ISO 8601 时间戳转换为
- LINUX下如何配置VLAN虚拟局域网_在LINU
- Windows如何使用BitLocker To G
- Win11怎么开启游戏模式_Win11优化游戏帧数
- Windows10怎么卸载预装软件_Windows
- 如何使用Golang读取日志文件_Golang b
- 如何使用Golang encoding/json解
- Go 语言标准库为何不提供泛型 Contains
- Windows 10怎么把任务栏放在屏幕上方_Wi
- Windows 11如何开启文件夹加密(EFS)_
- Python实现图数据库操作_Neo4j核心CRU
- Win10怎样卸载iTunes_Win10卸载iT
- Python解释执行模型_字节码流程说明【指导】
- c++中的Tag Dispatching是什么_c
- Win11怎样安装网易云音乐_Win11安装网易云
- LINUX怎么进行文本内容搜索_Linux gre
- mac怎么安装pip_MAC Python pip
- Win11怎么解压RAR文件 Win11自带解压功
- Windows如何拦截腾讯视频广告_Windows
- Windows10如何更改日期格式_Win10区域
- Win11如何关闭小娜Cortana Win11禁
- Python配置文件操作教程_JSONINIYAM
- Windows10系统怎么查看IP地址_Win10
- 如何在Golang中实现并发消息队列消费者_Gol
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- Win11怎样激活系统密钥_Win11系统密钥激活
- Python文本编码与解码_跨平台解析说明【指导】
- Python网络日志追踪_请求定位解析【教程】
- 如何在Golang中使用内置函数_Golangle
- 如何在Golang中处理模块包路径变化_Golan
- Windows蓝屏错误0x0000001E怎么修复
- Win11此电脑不在桌面上_Windows 11桌
- Win11如何更新显卡驱动 Win11检查和安装设


QQ客服