【问题标题】:fopen (php) from remote server works only for reading来自远程服务器的 fopen (php) 仅用于读取
【发布时间】:2020-05-30 13:31:42
【问题描述】:

我需要从远程服务器打开一个文本文件并在其中写入一些信息,使用 PHP fopen()

allow_url_fopenON(在我的 php.ini 中)。

我可以读取这个远程文件,但不能写入。

代码:

<?php
$data = 'some text';
$filename = 'ftp://admin:password@192.168.254.1/web/domain.com/public_html/test2.txt';
$fh = fopen($filename, 'r'); 
echo fread($fh, filesize($filename));
fclose($fh);

$fh = fopen($filename, 'w+'); 
if ($fh) {
  echo 'remote file is opened, writing data';
  fwrite($fh, $data);
  fclose($fh);
} else {
  echo 'remote file not opened';
}
?>

显示: 一些文字 远程文件未打开

我可以在写入文件时做什么?

【问题讨论】:

  • 还有人使用ftp协议吗?哇。

标签: php ftp fopen


【解决方案1】:

来自PHP: ftp://

允许读取访问现有文件并通过 FTP创建新文件。

您可以打开文件进行读取或写入,但不能同时打开。 如果远程文件已经存在于 ftp 服务器上并且您尝试打开它进行写入但没有指定上下文选项覆盖,则连接将失败。如果您需要通过 ftp 覆盖现有文件,请在上下文中指定覆盖选项并打开文件进行写入。或者,您可以使用 FTP 扩展。

还有一个说明:

注意:附加

文件可以通过 ftp:// URL 包装器附加。

我不确定覆盖是否意味着截断。如果有,可以下载修改再上传覆盖或者查看PHP: FTP Functions

更多来自PHP: Using remote files:

您只能使用此方法创建新文件;如果您尝试覆盖已存在的文件,则 fopen() 调用将失败。

然后是注释:

注意:

您可能从上面的示例中了解到您可以使用此技术写入远程日志文件。不幸的是,这不起作用,因为如果远程文件已经存在, fopen() 调用将失败。要进行这样的分布式日志记录,您应该查看 syslog()。

看来您可以创建一个文件或完全覆盖现有文件。我还没有看到 append 的例子。

【讨论】:

【解决方案2】:

PHP FTP URL wrapper 不支持同时打开文件进行读写。所以你不能使用w+模式(读写)。使用w 模式(只写)。

此外,FTP URL wrapper 默认不允许覆盖现有文件,您需要使用overwrite FTP context option 启用它。

$context = stream_context_create(['ftp' => ['overwrite' => true]]);
$fh = fopen($filename, 'w', false, $context); 

虽然这一切都非常低效,因为您将打开整个 FTP 会话两次。一次阅读,一次写作。您最好在一个会话中使用 FTP 函数 ftp_getftp_put

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 2019-01-31
    • 2015-08-12
    • 2019-01-06
    • 2010-12-13
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多