2012-02-27 13 views
6

私は、phpでfopen()を使って開かれたファイルにかなりの量のデータを書き込もうとしています。私が使用しているプロトコルラッパーはftpなので、ファイルはPHPコードを実行しているサーバーに対してリモートです。私が書いているファイルは、Windowsサーバー上にあります。php fwrite()は文字列データのファイルへの書き込みを完了しません。なぜですか?

ファイルが実際に私のPHPコードで作成されていることを確認しましたが、ファイル内のデータが存在しない(0KB)か、ファイルへの書き込みが途中で停止するという問題があります。なぜこれが当てはまるのか分かりません。ここで

は、私が操作を処理するために使用していますコードです:

$file_handle = fopen($node['ftp'].$path_to_lut, "wb", 0, $node['ftp_context']); 
include_once($file); 

if ($file_handle) 
{ 
    fwrite($file_handle, $string); //$string is inside included $file 
    fclose($file_handle); 
} else { 
    die('There was a problem opening the file.'); 
} 

私は私のローカルマシン上でそれをホストするときに、このコードは正常に動作しますが、私は私のウェブホスト(Rackspaceのクラウド)にアップロードするとき、それ失敗する。これは、私がRackspaceの私のサーバの設定に関係する問題だと信じていますが、PHPコードをもっと頑強にするためにできることがあるかどうかを知りたいのです。

fwriteを確実にするためのアイデアは、実際にリモートマシンに文字列の書き込みを終了しますか?

ありがとうございます!

さて、私はそうのようにファイルに書き込むコードを変更:

if ($file_handle) 
{ 
    if ($bytesWritten = fwrite($file_handle, $string)) { 
     echo "There were " . $bytesWritten . " bytes written to the text file."; 
    } 

    if (!fflush($file_handle)) { 
     die("There was a problem outputting all the data to the text file."); 
    } 

    if (!fclose($file_handle)) { 
     die("There was a problem closing the text file."); 
    } 

} else { 

    die("No file to write data to. Sorry."); 

} 

何奇妙なことは、エコー文は以下を示していることである:

に書き込まれた10330のバイトがありましたテキストファイル。

まだ、私はFTP経由でテキストファイルのサイズを確認すると、0Kと表示され、ファイル内のデータは実際には切り捨てられています。 PHPがRackspace Cloud以外のマシン上でホストされている場合は、FTPサーバー自体と関係があるとは思いません。

**アップデート** 私は、Rackspace Cloudの担当者に、サーバからftpにする場合はパッシブftpが必要だと述べました。私はパッシブftp接続を処理するようにリモートサーバを設定し、パッシブftpはOSX Transmit FTPクライアント経由でリモートサーバ上で動作することを確認しました。 )右のfopen()文の後

ftp_pasv($file_handle, true); 

が、私は(ftp_pasvする有効なリソースを提供しなかったと言ってPHPからエラーを取得する:私は付け加えました。 PHPが作成するftpサイトへの接続が、PASVでACTIVEでなく、fwrite()を使用していることを確認するにはどうすればよいですか?ちなみに、私はWindowsマシンがPHPコードで書き込まれているファイルがディスク上に4096バイトであると報告していることに気付きました。その額を超えることはありません。これは、トラブルシューティングのためだけにoutput_buffering PHPの値を65536に変更するようになりましたが、それでも問題は解決されませんでした。 。 。彼らは十分な管理者権限を提供していませんので、Rackspaceのクラウドサイトの製品の私の仮想サーバー上の問題のトラブルシューティング**更新部のDUEX **

はあまりにも難しい証明しました。私はRackspaceのCloud Server製品に非常に小さなクラウドサーバーを作成し、fwrite()で同じエラーが発生しているところまですべてを構成しました。そのサーバーからリモートサーバーにファイルを書き込むことができるように、クラウドサーバーのbashシェルで基本的なftpコマンドを使用しました。それは正常に働いた。ですから、私はfwrite()のPHP実装内にバグがあると想定しています。これは恐らく何らかのタイプのデータ抑制スロットが原因であると思われます。Rackspace Cloudサーバーで提供されているものと比較して遅いアップスピードを持つローカル環境からリモートサーバーに書き込むと、正常に動作します。効果的に書き込み速度を下げる方法はありますか?単に:) III *

ので

**更新部アスクン、私は@a悲しい男からの提案を取り、誰かが新しいファイルに書き込むと、それを送信しようとして役立つかもしれない機能を実装しましたFTP経由でその全体がオフ:

function writeFileAndFTP($filename=null, $data=null, $node=null, $local_path=null, $remote_path=null) 
{ 

    // !Determin the path and the file to upload from the webserver 
    $file = $local_path.'/'.$filename; 


    // !Open a new file to write to on the local machine 
    if (!($file_handle = fopen($file, "wb", 0))) { 
     die("There was a problem opening ".$file." for writing!"); 
    } 


    // !Write the file to local disk 
    if ($bytesWritten = fwrite($file_handle, $data)) { 
     //echo "There were " . $bytesWritten . " bytes written to " . $file; 
    } 

    // !Close the file from writing 
    if (!fclose($file_handle)) { 
     die("There was a problem closing " . $file); 
    } 

    // !Create connection to remote FTP server 
    $ftp_cxn = ftp_connect($node['addr'], $node['ftp_port']) or die("Couldn't connect to the ftp server."); 

    // !Login to the remote server 
    ftp_login($ftp_cxn, $node['user'], getPwd($node['ID'])) or die("Couldn't login to the ftp server."); 

    // !Set PASV or ACTIVE FTP 
    ftp_pasv($ftp_cxn, true); 


    // !Upload the file 
    if (!ftp_put($ftp_cxn, $remote_path.'/'.$filename, $file, FTP_ASCII)) { 
     die("There was an issue ftp'ing the file to ".$node['addr'].$remote_path); 
    } 

    // !Close the ftp connection 
    ftp_close($ftp_cxn); 

} 
+0

'include_once($ file);' - そのコードはどこですか? – hakre

+0

次のようになります: '$ string ="長さ約20行の文字列 ";' – ariestav

+0

'var_dump($ node ['ftp_context']);'出力は何ですか? (ユーザー名/パスワードを削除する)。 – hakre

答えて

4

fwriteが一度に書くことができる文字列の長さは(それが書き込まれたバイト数を返す理由である)いくつかのプラットフォームに限定されています。ループで実行することもできますが、より良い考え方は単に文字列全体が書き込まれることを保証するfile_put_contentsを使用することです。

http://www.php.net/manual/en/function.file-put-contents.php

+0

興味深いことに、ポインタのおかげで。好奇心のために、.htaccessファイルに設定してfwrite()のデータの制限を変更することができるapache指令がありますか? – ariestav

+0

ダウトフル)、さらにftpを使用している場合は、ネットワークに関するより多くの情報が得られます。 file_put_contentsは機能しましたか? –

+0

今すぐ確認してください。 。 。 – ariestav

関連する問題