我有一个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”模式应该创建它。)
答案 0 :(得分:1)
file_put_contents默认情况下会擦除该文件(如果该文件已存在)。你必须要求他不要。 看看这里: http://www.php.net/manual/en/function.file-put-contents.php 请参阅:如果filename不存在,则创建该文件。否则,将覆盖现有文件,除非设置了FILE_APPEND标志。
答案 1 :(得分:0)
这不是最好的解决方案(绝对),但我设法弄清楚了...... 我在同一个托管服务上使用了2个不同的主机,两个都有" open base_dir = On" &安培; "安全模式=关"。
它看起来像:
$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" line - 它工作,但它没有关闭连接,而且我必须删除现有文件才能用新内容覆盖它,这使得它很愚蠢。 虽然它有效,但我真的希望有人给我一个比我更好的解决方案。