0

FTP サーバーに接続し、ファイルの内容を読み取り、小さな変更を加え、元のファイルを上書きする PHP コードがあります。

次のようになります。

$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」を返します。私は「false」を取得しました:/これは、次のことさえできなかったことを意味します:

@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

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);

新しいファイルはホスティングから削除されます!!

ファイルが「fopen」で作成され、「fwrite」で書き込まれた後、「fclose」がファイルを削除する理由を見つけることができませんでした。

したがって、「fclose」行を追加していない場合-機能しますが、接続を閉じません。また、新しいコンテンツで上書きする前に、既存のファイルを実際に削除する必要があるため、ばかげています。 . それは機能しますが、誰かが私よりも優れたソリューションを提供してくれることを本当に望んでいます.

于 2014-06-17T22:52:52.000 に答える