• ベストアンサー

print出力での文字制限について

HttpのGetリクエストを使って、他のプログラムからデータを取得する プログラムを作っています。 http://localhost/get_data.php?file=abc.dat (abc.datはテキストやバイナリーデータ) -----(概略リスト)-------------------------------- $filename = $_GET['file']; $fsize=filesize($filename); $fp = fopen($filename, "rb"); $read_data=base64_encode(fread($fp,$fsize)); fclose($fp); $len=3997; // 3997+4=4001:OK print "max length=".$len."<br>\n"; print substr($read_data,0,$len)."#end<br>\n"; ------------------------------------------------ このような、処理をした時に print分の最後の「#end」が 表示されていれば、問題なく出力されていると言う方法で行っています。 その結果、3997+4=4001までは問題なく出力されますが それを越しますと、文字が途切れます。 例: $len=3997 >> ~~abcedefg12345#end $len=3998 >> ~~abcedefg123456#en どこで制限が掛かっているのでしょうか? (値は変えれるのでしょうか) それとも何かやり方などでおかしい所があるのでしょうか? php.ini や apache の httpd.conf など確認してみましたが それに該当するようなものは見当たりません。 尚、環境は以下のような内容です。 サーバーOS:WindowsXP pro. apache:2.0 PHP:version 5.0 ご存知の方がいらっしゃいましたら、よろしくご教授お願いします。

  • PHP
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんばんわぁ、Blackwinglsです。 すみません、勘違いしていたようで・・・・(^^; えっと同じコードを書いて試してみたら、 $len=5000; でもOKでした。 とはいえ、私の環境では $len=3996; で、文字表示が背景と同じ色になってしまって表示されていないような感じになってしまいましたが・・・・・。 一応、ソースで確認するぶんでは出力されているようです。 IEの仕様ではないでしょうか? ではでは~☆ミ

moo9999
質問者

お礼

Blackwingls様、何度もありがとうございます。 IEの仕様では?..と言うことで、念のために netscape で やってみましたら、ご推察の通り、ブラウザの仕様のようで $len=5000 や 9000 でも問題なくいけました。 ん~、これは予想外ですね。 逆に、どうしていいか分からなくなりました。(笑) ただ現状では、IEのシェアが格段に大きいので IEに合わすしか ありませんので、何か手立てを考えてみます。 ありがとうございました。

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

fread()は一回に読み込む最大値は8192 バイトまでのようですが、サイズ的にはここではなさそうですね。 あと、php.iniのoutput_bufferingのdefaultが4096のようだけど、ここはどうなってますか? たぶん、もうちょっと小刻みに読んでは出力するようにプログラムした方がよいように思います。

moo9999
質問者

お礼

ご回答ありがとうございます。 > fread()は一回に読み込む最大値は8192 バイトまでのようですが ..なるほど、こう言った制限もあるのですね。   ただ、念のためにこちらのPGでfread後のlengthを見てみましたら   ファイルサイズ相当の10KB以上ありましたので、どこかでそのような設定に   なってしまっているのでしょうか。   もしご存知でしたら、その設定場所も教えて頂けると助かります。 後、ご指摘の  > php.iniのoutput_bufferingのdefaultが4096.. につきましては、output_buffering = off となっていました。 念のために、output_buffering = 4096 や 10000 など変えて サーバー再起動して試してみましたが、変わりませんでした。 他にもいろいろと検索してみてますが、今のところ打つ手無しです。 制限の個所や制限内容がわかれば、4000バイトなどで細かく処理してもいいのでしょうが 環境によって変わると、4000と言った数値にも意味がなくなりますので このままではどうしようもないですね。 何か他にヒントでもありましたら、よろしくお願いします。

回答No.1

こんにちはぁ、Blackwinglsです。 GETは文字数に制限があったような・・・・ POSTではダメなんですか? ではでは~☆ミ

moo9999
質問者

お礼

ご回答ありがとうございます。 今回は、Get/Postの問題と言うより、Print文での文字出力の制限の疑問なのでPostに変えても一緒のような気がしますが、 何か変わる要素がありますでしょうか。 よろしくお願いします。

関連するQ&A

  • print_rで出力した配列データファイルをfile_get_cont

    print_rで出力した配列データファイルをfile_get_contentsでそのまま取り込もうとしましたが、配列としてではなく文字列として取り込んでしまいます。 ひとつの配列にまとまってしまします。 text.php $data=array(1,2,3,4,5); print_r($data); Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) output.php これを別ファイルで取り込むと$value= file_get_contents("text.php"); echo $value; print_r($value);両方とも Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) が出力されました。 配列として取り込みたいのですが可能でしょうか?

    • ベストアンサー
    • PHP
  • C言語でファイルを出力

    ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、 できたファイルの後に?マークがついてきます。 file = fopen("filename.txt", "w"); for(j=0; j<30; j++){ fprintf(file ,"%d.dat\n",j ); } fclose(file); file2 = fopen("filename.txt", "r"); として、ファイル名を書いたファイルをつくってから、 for(k=0; k<30; k++){ fgets(fp,sizeof(fp),file2); file_out = fopen(fp,"w"); 省略 fprintf(file_out, %e %e \n",a ,b); fclose(file_out); } fclose(file2); をして、30個のファイルを出力すると、 0.dat? 1.dat? 2.dat? . . . 29.dat? というファイルができてしまいます。 ファイルの中はしっかりできています。 なにか解決法を知っている方がおりましたら、どうか教えて下さい。

  • TSVファイルを読み込んでCSV形式に変換したい

    PHP4でTSVファイルを読み込んでCSVファイルに変換しようとしています。下記のようにしましたがうまくいきません。 どこがおかしいでしょうか? $file="sample.txt"; // 変換対象ファイル $contents =file_get_contents($file); $contents =str_replace("\t", ",", $contents); $fp = fopen ($contents, "r"); while(($line= fgetcsv($fp,1024,","))) { print "line= ".$line[0]."<br>"; print "line= ".$line[1]."<br>"; } よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのリロード時の処理

    PHPのリロード時の処理 PHPプログラム初心者です。 掲示板のプログラムを作成しております。 以下のコードで、リロード時、自動で投稿ボタンが押されてsubmitしてしまいます。 自分で考えた解決策としては、下記のwriteDate()内で、条件を入れることです。 $_GET['personal_name'];のデータを変数に保持し、次にリロードされた時同じものが返ってきら、writeDate()内の処理をしないという方法です。 このときの変数の保存の仕方が解りません。 ご存じの方がおられましたら教えてください。 <?php if($_SERVER["REQUEST_METHOD"]=="GET"){ writeData(); } readData(); function readData(){ $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'rb'); if($fp){ if(flock($fp,LOCK_SH)){ while(!feof($fp)){ $buffer=fgets($fp); print($buffer); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } fclose($fp); } function writeData(){ //--------ここで同じ書き込みデータがあればreturnしたい。------- $t=$_GET['personal_name']; $personal_name=$_GET['personal_name']; $contents=$_GET['contents']; $contents=nl2br($contents); $data="<hr>\r\n"; $data=$data."<p>[投稿者:".$personal_name."]</p>"; $data=$data."[内容]"; $data=$data."<p>".$contents."</p>"; $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'ab'); if($fp){ if(flock($fp,LOCK_EX)){ if(fwrite($fp,$data)===FALSE){ print('ファイル書き込みに失敗しました'); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } $data=null; fclose($fp); } ?>

    • ベストアンサー
    • PHP
  • xreaで7行のプログラムがエラー

    <?php print '<body>'; print 'print関数は成功。<br>'; $fp = fopen('dat.dat', 'wb'); if(!$fp)print '失敗。'; else{print '成功。';fclose($fp);} ?> ブラウザは以下のように表示しました。 どこがいけないのでしょうか? print関数は成功。 Warning: fopen(dat.dat): failed to open stream: Permission denied in ****/foptest.php on line 4 失敗。

    • 締切済み
    • PHP
  • 日本語のデータが文字化けをしてしまいます。

    PHP初心者です。 レンタルサーバでdatファイルに書き込んでる情報をPHPファイルで出力すると、日本語の部分が文字化けしてしまいます。 datファイルから読み込んでいない日本語の部分はちゃんと表示されています。 また、datファイルにはちゃんと日本語のデータになっています。 文字コードはEUC、 PHPの出力はSJIS。 これはどういうことでしょうか? どなたか教えて下さい。 ソースは以下3ファイル構成↓ <入力するデータを集めるファイル> <html> <body> <h1 style="background:#cccccc">ゲストブック(書き込み)</h1> <form method="POST" action="guest_write.php"> お名前: <input type="text" name="name" size="20" maxlength="30" /><br /> メッセージ: <input type="text" name="message" size="70" maxlength="255" /><br /> <input type="submit" value="送信" /> </form> </body> </html> <入力したデータをdatに書き込むファイル> <?php $file=fopen("guest.dat","a"); flock($file,LOCK_EX); $line =date("Y年 m月d日 H:i:s")."\t"; $line.=$_POST['name']."\t"; $line.=$_POST['message']."\t"; fputs($file,$line."\n"); flock($file,LOCK_UN); fclose($file); header("Location: guest_input.php"); ?> <datファイルから読み込んで出力するファイル> <html> <body> <h1 style="background:#cccccc">ゲストブック(閲覧)</h1> <?php $file=fopen("guest.dat","r"); while($row=fgetcsv($file,1024,"\t")){ ?> <ol> <li>お名前:<?php print($row[1]); ?></li> <li>メッセージ:<?php print($row[2]); ?></li> <li>書き込み日時:<?php print($row[0]); ?></li> </ol> <hr /> <?php } fclose($file); ?> </body> </html> 以上ですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • データ受け取り

    チェックボックスよりデータを送信し、次ページで受け取りたいのですが、データは送信されているようですが、データを受け取って表示することができません。 <プログラム(一部省略)> <?php if ($handle = opendir('.')) {     while (($file = readdir($handle))!=false) {         if ($file != "." && $file != "..") {             print "<tr><td><input type=checkbox name=fp[$i] value=$file></td>";             <<省略>>             $i++;        }     } } ?> ↓次ページ(一部省略)↓ <?php for($i=0;$i<$n;$i++){ $fp[$i]=$_GET{"fp[$i]"}; print "$fp[$i]<br>"; } ?>

    • ベストアンサー
    • PHP
  • 複数のプログラムを1ページで行えますか?

    PHP始めたばかりです。 下記の事で困っています。 単体ではうまく動くのに二つ並べると動作しません。 どうしたら複数のプログラムを1ページで行えますか? どこかに番号を付けて同じにならないようにするのかなとは思いますが分かりません。 ご教示お願い致します。 <?php $file = 'txt/a0001.txt'; if ($_POST['button_save']) { //POSTされたときは書き込み処理をする $fp = @fopen($file, 'w'); if ($fp == false) { print "このファイルには書き込みできません。<br>\n"; } else { $contents = htmlspecialchars($_POST['textBox_contents']); fwrite($fp, $contents); fclose($fp); print "書き込み完了しました。<br>\n"; } } $text = file_get_contents($file); $text = htmlspecialchars($text); ?> <textarea name="textBox_contents" cols="40" rows="2"><?php echo($text); ?></textarea> <br/> <input type="submit" name="button_save" value="保存"> </form> <p> <p> <?php $file = 'txt/b0001.txt'; if ($_POST['button_save']) { //POSTされたときは書き込み処理をする $fp = @fopen($file, 'w'); if ($fp == false) { print "このファイルには書き込みできません。<br>\n"; } else { $contents = htmlspecialchars($_POST['textBox_contents']); fwrite($fp, $contents); fclose($fp); print "書き込み完了しました。<br>\n"; } } $text = file_get_contents($file); $text = htmlspecialchars($text); ?> <textarea name="textBox_contents" cols="40" rows="2"><?php echo($text); ?></textarea> <br/> <input type="submit" name="button_save" value="保存"> </form>

    • ベストアンサー
    • PHP
  • 新規ファイルを作成する

    にはどうしたらいいのでしょうか? <?php $file='gomi.dat'; $in=isset($_POST['in'])?$_POST['in']:'bad'; if(file_exists("$file")) { $a=file("$file"); foreach($a as $value) { echo "$value<br/>"; } } $fp=fopen("$file","w"); // <-------------- fwrite($fp,"$in\n"); fclose($fp); ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>"> <input type="text" name="in"/> <input type="submit" value="send"/> </form> は動きませんが $fp=fopen("$file","w"); // <-------------- を $fp=fopen("$file","r+"); // <-------------- としてあらかじめ空の gomi.dat (モード777)を作っていれば動きます どうしたら $fp=fopen("$file","w"); // <-------------- にしても動くようになるでしょうか?

    • ベストアンサー
    • PHP
  • 無料ホームページの鯖でPHPでfwrite出来ない

    無料ホームページのサーバに"php"というフォルダをアップし、その中に"write.php", "text.txt","read.php"というファイルを作って実行させたのですが、 "write.php"で、 $file = "text.txt"; $fp = fopen($file, "w"); if ($fp == FALSE) { print "ファイルオープン失敗<br />"; } else { fwrite($fp, $text); fclose($fp); } を実行しても"text.txt"の内容が変わらない(空のまま)のですが、何がいけないのでしょうか? "text.php"のパーミッションは666で、"php"フォルダは707です。 考えられる原因をご教授下さい、お願いします。

    • 締切済み
    • PHP

専門家に質問してみよう