0

我有一个 PHP 代码可以连接到 FTP 服务器,读取文件的内容,进行微小的更改,然后覆盖原始文件。

看起来像:

$stream_context = stream_context_create(array('ftp' => array('overwrite' => true)));

$file_content = file_get_contents($ftp_file); // this line works
$file_content = str_replace('some content', 'another content', $file_content); // this also..
file_put_contents($ftp_file, $file_content, 0, $stream_context);  // this one doesn't :/

真正的问题是“file_put_contents”工作了很长时间,但现在没有了。它现在所做的很奇怪:它会从服务器中删除原始文件..另外,如果我将其更改为:

file_put_contents($new_ftp_file, $file_content);

据我所知,它应该创建新文件并将内容放入其中,但它根本不创建它。

我正在使用的托管服务几天前更改了 PHP 版本。我不记得以前的版本是什么,但现在是:5.2.17

谢谢!:)

一些变化

我找到了这篇文章:http : //www.php.net/manual/en/function.file-put-contents.php#86864 与“file_put_contents”相同,但使用 foen、fwrite 和 fclose(我发送他的示例是因为结果..)。如果它不能“fopen”文件,他的函数将返回“false”,如果成功则返回“bytes”。我得到了“假”:/这意味着它甚至无法做到:

@fopen($filename, 'w');

尽管具有相同文件地址的“file_get_contents”正在工作。


阅读正在工作(但如果您使用 $filename 并自己在客户端 FTP 上使用它 - 它可以工作):

@fopen($filename, 'r');

我的主机(执行操作)的“open base_dir”设置为 false,但目标主机(具有目标文件)设置为 true。


我有一个想法将新内容保存在一个新文件中,所以我尝试了类似的方法:

$f = @fopen($new_ftp_file, 'w'); //this one seems to work and connect
fwrite($f, $file_content); // this one seems to work either and returning the number of byes..
fclose($f);

问题是它们都没有真正起作用。我使用我的脚本使用的相同凭据登录到 FTP 地址,但我没有找到新文件。它根本不是创造出来的。(我提醒你,“$new_ftp_file”是一个不存在的文件的路径,所以“fopen”上的“w”模式应该创建它)。

4

2 回答 2

1

file_put_contents do erase the file by default if it already exists. You have to ask him to don't. Look at here: http://www.php.net/manual/en/function.file-put-contents.php See: If filename does not exist, the file is created. Otherwise, the existing file is overwritten, unless the FILE_APPEND flag is set.

于 2014-06-17T14:52:28.203 回答
0

这不是最好的解决方案(绝对),但我设法弄清楚了一些事情。我在它们相同的托管服务上使用了 2 个不同的主机,两者都具有“open base_dir = On”和“safe mode = Off”。

它看起来像:

$ftpstring = "ftp://user:password@anotherhosteddomain.com";
$file = file_get_contents($ftpstring . 'index.html'); // this line works as expected. (yeah, the other hosting has this file);

然后,如果您尝试编写如下内容:

$handler = fopen($ftpstring.'index.html', "w");

它不起作用,并告诉您它无法以写入模式访问现有文件。所以如果你正在做类似的事情:

$newfile_handler = fopen($ftpstring.'index_new_version.html', "w");
fwrite($newfile, "1122");

所以是的 - 它有效!但现在是一个棘手的问题..当我添加这一行时:

fclose($newfile_handler);

新文件已从主机中删除!!

我找不到“fclose”在“fopen”创建并在“fwrite”写入后删除文件的任何原因。

因此,如果您不添加“fclose”行-它可以工作,但不会关闭连接,而且我必须先删除现有文件,然后才能用新内容覆盖它,这很愚蠢。 . 虽然它有效,但我真的希望有人给我一个比我更好的解决方案。

于 2014-06-17T22:52:52.000 回答