2012-03-23 19 views
0

3つの配列(同じ長さで、500個ほどのアイテムが入る)を取得し、テキストファイルに書き込むプログラムがあります。"大きな"ファイルを保存する際に問題が発生するPHP

しかし、大きなファイルを書き込む際に問題が発生しています。配列は、キャンバス描画アプリケーションの座標とタイムスタンプですので、長さを制御できます。私は、ファイルが2MB以上になると、ファイルを保存しないことに気付きました。保存できる最大ファイルは2.18MBでした。関連する質問PHP: Having trouble uploading large filesから私はこの原因がフリーのホスティングサーバーでホストされている可能性が高いと判断しました。私は(のphpinfo見てきた)と、ここ4、関連する番号は、次のとおりです。ここで

memory_limit 16M 
max_execution_time 30 
upload_max_filesize 5M 
post_max_size 5M 

は、関連する書き込みコードです:

// retrieve data from the JS 
$x_s = $_GET['x_coords']; 
$y_s = $_GET['y_coords']; 
$new_line = $_GET['new_lines']; 
$times = $_GET['time_stamps']; 

print_r($_GET); 
$randInt = rand(1,1000); 

// first want to open a file 
$file_name = "test_logs/data_test_" . $randInt . ".txt"; 
$file_handler = fopen($file_name, 'w') or die("Couldn't connect"); 

// For loop to write the data 
for ($i = 0; $i < count($x_s); $i++){ 
    // If new line want to write new line! 
    if (!$new_line[$i]){ 
     if ($i!=0){ 
      // If not the first line 
      fwrite($file_handler, "LINE_END\n"); }   
     fwrite($file_handler, "LINE_START\n"); 
    } 

    // Write the x coord, y coord, timestamp 
    fwrite($file_handler, $x_s[$i] . ", ". $y_s[$i] .", ". $times[$i]. "\n"); 

    // If last line then write last LINE_END 
    if ($i == (count($x_s)-1)){ 
     fwrite($file_handler, "LINE_END\n"); } 
} 

fclose($file_handler); 

私は私のローカルホスト上のセットアップPHPサーバーをしましたし、アクセス権を持っていますエラーログに出力します。これは私が得ているものです。

[Fri Mar 23 20:03:02 2012] [error] [client ::1] request failed: URI too long (longer than 8190) 

問題は解決:問題は、私がURIに追加されたデータを、大量のを送信するためにGETを使用していたということでした。 URIが8190文字に達すると、エラーが発生しました。 POSTを使用するとこれが解決されます。

+0

サーバーにsuhosinパッチがインストールされていますか? – piotrekkr

+0

私はこれが無料のWebサーバー上にあると言っていたので、何も考えません –

+0

'phpinfo();を呼び出すと表示されます – chiborg

答えて

1

upload_max_filesizeおよびpost_max_sizeは、転記できるデータの最大サイズを決定します。しかし、これはおそらくあなたの問題ではありません。のデータが書き込まれます(データ制限に達した場合、スクリプトは実行されません)。

スクリプトには、max_execution_timememory_limitの2つの制限があります。 Apacheのエラーログファイルを見て、エラーメッセージが表示されているかどうかを確認します(限界に達していることを示す)。

また、時間やメモリ使用量の進行状況を確認するために、forループの内側にログインしてみてくださいすることができます

if(($i % 100) == 0) { // log every 100 entries 
    error_log(date("H:i:s ").memory_get_usage(true)."Bytes used\n", 3, 'test.log'); 
} 

また、Suhosinパッチは、あまりにも多くのデータポイントを送信してからあなたを妨げているということがあります http://www.adityamooley.net/blogs/2012/01/09/php-suhosin-and-post-data/

+0

このファイルが無料のWebサーバーでホストされている場合は、Apacheエラーログを見ることはできますか? –

+0

'if($ i%100 == 0)' :) – piotrekkr

+0

いくつかのホスティングプロバイダはあなた自身のログファイルへのアクセス権を与えます。そうでなければエラー出力を 'ini_set ( 'error_log'、 '/path/of/your/choice/error.log'); ' – chiborg

1

スクリプトが最大実行時間を超えている可能性があります。

はあなたのコードの先頭にこの

set_time_limit(0)

を追加します。

+0

これを試してみても違いはありません:/ –

+0

このスクリプトをlocalhostで実行しようとしましたか? – Leri

+0

いいえ、私はPHPの設定がありません –

1

1)max_input_time

ini_set ('max_input_time', 50); 

2チェック)のphpinfoで確認してください() - あなたはSuhosinパッチを持っていますか?

あなたはapache error_logを見てください - あなたは限界に達しているはずです。

ini_set('error_reporting', E_ALL); 
error_reporting(E_ALL); 
ini_set('log_errors', true); 
ini_set('html_errors', false); 
ini_set('error_log', dirname(__FILE__).'script_error.log'); 
ini_set('display_errors', true); 
+0

の先頭にini_set()行を挿入しましたchiborgへの私の回答を参照してください。これは無料のWebサーバーでホストされている場合はApacheのエラーログを表示できますか? はSuhosinパッチが をインストールし、そのコードでまだエラーが記録され、または任意のログファイルが作成され得ていない持っていない: –

+0

あなたがerror_logに –

+0

について尋ね構成に関するルートを尋ねるか、少なくともできることchiborgに私の答えを参照してください。エラーログ –

0

PHP(従ってウェブサーバ)自体を保護してみてください。おそらく、大きなファイルをアップロードするために別の仕組みを使用しています。これは、既知の(信頼できる)ソースからのものだと思います。 SFTPなどの別のメカニズムを使用します。

関連する問題