0

0

PHP 远程服务器文本文件编辑:正确使用 FTP 上传与覆盖文件的完整教程

聖光之護

聖光之護

发布时间:2026-03-10 22:36:23

|

970人浏览过

|

来源于php中文网

原创

PHP 远程服务器文本文件编辑:正确使用 FTP 上传与覆盖文件的完整教程

本文详解如何在 PHP 中通过 FTP 安全、可靠地编辑远程服务器上的文本文件,重点解决 ftp_fput() 失败、file_exists() 误判路径、文件零字节等常见问题,并提供可直接复用的健壮实现方案。

本文详解如何在 php 中通过 ftp 安全、可靠地编辑远程服务器上的文本文件,重点解决 `ftp_fput()` 失败、`file_exists()` 误判路径、文件零字节等常见问题,并提供可直接复用的健壮实现方案。

在 Web 应用多站点协同场景中(如统一域名白名单管理),常需从不同子站动态更新部署在同一主站的共享配置文件(如 email_domain_whitelist.txt)。然而,直接使用 PHP 的 FTP 扩展操作远程文件时,开发者极易陷入以下典型误区:

  • ❌ 错误地将 HTTP URL(如 https://example.com/...)传入 file_exists() 或 ftp_delete() —— 这些函数不支持远程 URL,仅作用于本地文件系统;
  • ❌ 混淆 ftp_fput() 与 ftp_put():ftp_fput() 需传入已打开的 resource 句柄(如 fopen() 返回值),但若该句柄指向未正确写入或未关闭的临时文件,极易导致上传空文件(0 字节);
  • ❌ 手动删除再上传——既增加失败风险,又非必要:ftp_put() 在目标路径存在同名文件时自动覆盖,无需显式调用 ftp_delete()。

✅ 正确做法是:本地生成临时文件 → 写入内容 → 关闭句柄 → 使用 ftp_put() 直接上传覆盖。以下是优化后的核心流程与可生产环境使用的完整代码示例:

✅ 推荐实现:安全、简洁、幂等

function eri_update_global_whitelist($string, $add_or_remove = 'add') {
    // 1. 域名清洗与校验(保持原逻辑)
    $domains = array_filter(
        array_map('trim', explode(',', strtolower(str_replace(' ', '', $string)))),
        function($d) { return strpos($d, '.') !== false; }
    );
    $invalid = array_diff(explode(',', strtolower(str_replace(' ', '', $string))), $domains);

    if (empty($domains)) {
        echo '<br>No valid domains to process.';
        return;
    }

    $filename = 'email_domain_whitelist.txt';
    $remote_path = '/eri-webtools-plugin/data/' . $filename; // 注意:这是 FTP 服务器上的相对路径(从根目录起)

    // 2. 读取远程现有内容(通过 HTTP,仅用于读取)
    $remote_url = 'https://example.com/eri-webtools-plugin/data/' . $filename;
    $current_content = @file_get_contents($remote_url) ?: '';
    $existing_domains = array_filter(
        array_map('trim', explode(',', strtolower(str_replace(' ', '', $current_content)))),
        function($d) { return strpos($d, '.') !== false; }
    );

    // 3. 合并/过滤逻辑
    $new_domains = $add_or_remove === 'add'
        ? array_values(array_unique(array_merge($existing_domains, $domains)))
        : array_values(array_diff($existing_domains, $domains));

    // 4. 生成本地临时文件(关键!)
    $local_temp_file = $filename; // 简单起见,使用同名;生产环境建议用 tempnam()
    $fp = fopen($local_temp_file, 'w');
    if (!$fp) {
        echo '<br>Failed to create local temp file.';
        return;
    }

    $content_to_write = implode(', ', $new_domains);
    fwrite($fp, $content_to_write);
    fclose($fp); // ⚠️ 必须关闭!否则 ftp_put 可能读取到空/缓存内容

    // 5. FTP 连接与上传(自动覆盖)
    require_once $_SERVER['DOCUMENT_ROOT'] . '/wp-content/plugins/eri-webtools-plugin/ftp_config.php';

    $conn = ftp_connect($ftp_server);
    if (!$conn) {
        echo '<br>FTP connection failed.';
        return;
    }

    $login = ftp_login($conn, $ftp_username, $ftp_userpass);
    if (!$login) {
        echo '<br>FTP login failed.';
        ftp_close($conn);
        return;
    }

    ftp_pasv($conn, true); // 启用被动模式(推荐)

    // ✅ 核心修复:使用 ftp_put() + 本地文件路径(字符串),非 resource
    if (ftp_put($conn, $remote_path, $local_temp_file, FTP_ASCII)) {
        echo '<br>✅ Successfully updated remote whitelist: ' . count($new_domains) . ' domains.';
    } else {
        echo '<br>❌ FTP upload failed. Check permissions and path.';
    }

    ftp_close($conn);

    // 6. 清理本地临时文件(可选但推荐)
    @unlink($local_temp_file);
}

? 关键注意事项总结

  • 路径语义区分清晰

    • file_get_contents('https://...') ✅ 仅用于读取远程 HTTP 资源;
    • ftp_put($conn, '/remote/path.txt', 'local_file.txt', ...) ✅ remote_path 是 FTP 服务器上的绝对路径(从根起),local_file.txt 是本地磁盘上的完整文件路径(字符串)
    • file_exists('https://...') ❌ 永远返回 false,切勿使用。
  • 资源管理铁律

    OneAI
    OneAI

    将生成式AI技术打包为API,整合到企业产品和服务中

    下载

    立即学习PHP免费学习笔记(深入)”;

    • fopen() 后必须 fclose(),否则 ftp_put() 可能因文件句柄未刷新而上传空内容;
    • 临时文件建议使用 tempnam(sys_get_temp_dir(), 'whitelist_') 生成唯一路径,避免并发冲突。
  • 错误处理增强建议(生产环境必备):

    • 使用 ftp_ssl_connect() 替代 ftp_connect()(如服务器支持);
    • 对 ftp_put() 失败添加重试机制与日志记录;
    • 白名单更新前先备份远程文件(ftp_rename($remote_path, $remote_path . '.bak'))。

通过以上重构,你将获得一个稳定、可维护、符合最佳实践的远程配置文件编辑方案——不再依赖脆弱的 ftp_fput(),也不再为“文件找不到”或“上传空白”而深夜调试。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.20

fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

344

2023.11.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1208

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1184

2024.04.29

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号