• ベストアンサー

PHP配列をJavaScriptに渡したい(再)

済みません。まだ成功しておりませんので、引き続きご教授をお願いいたします。 4万行になるGermJ.txt というファイルを4000行に削ると、成功しましたが、それ以上の行数だと画面が真っ白になったり、ハング状態になりました。 もう後一歩なのですが、どうか、よろしくご指導ください。 function getArray() { <?php $file = fopen("GermJ.txt","r"); $phparray = file('GermJ.txt'); fclose($file); $max = count($phparray); for ($i=0; $i<$max; $i++) { echo 'jsArray[' . ($i) . ']="' . ereg_replace("\r\n","",addslashes($phparray[$i])) . '";' . "\n"; } ?> for(i=0;i<jsArray.length;i++) { document.writeln(jsArray[i]+"<br>\n"); } }

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

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.3

>巨大なphp配列から一行だけをJSの一行文字列に変換して、 >クライアント側の次の要求(次の行を出せ!、とか、 >aで始まるphp配列の第一列を出せ!)に応じて >JSに変換して表示することにしようと思います。 CGI(Perl/PHP/C言語..等々)との組み合わせでは無理でしょう。 データをサーバーに置き、クライアント側からの要求にリアルタイムに応答することはできません。 それをするにはクライアントと同期して動作するサービスをサーバー側で立ち上げておく必要があります。 (バックエンド、もしくはミドルプログラムと言います) それに対してブラウザ側(フロントエンド)は通信をサポートするものが必要です。HTMLの FORMではできません。JavaScript, JavaApplet, Flashなどで利用できると思いますが、私はここら辺に疎いのでこれ以上の説明はできません。あしからず...。 Java Appletを使ってサーバーと通信するサンプルになりそうなものが見つかりました。プログラムは見てません(というかJavaは読めない)が参考になるのではないでしょうか。 http://www.orange.ne.jp/~yabu/java/counter/java.html #上でできないと書いてしまいましたが、これは JavaApplet+Perlですね^^;)。

参考URL:
http://www.atmarkit.co.jp/
tonka729
質問者

お礼

そうですか。。。お世話になっているyatokesaさまにそうおっしゃられてしまうと、もう私としてはダメです。あきらめることにします。ただ、CGIを使用してなのですが、フレームを使ってFrame1に一文字入力のたびにイベントKeuUp()をつかまえて、Frame2にForm送信の結果を表示させることは不満足ながらできていますので、これで我慢します。 yatokesaさま今後ともよろしくお願いします。

その他の回答 (2)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

<html> <head> <script language="JavaScript" type="text/javascript"> <!-- var n = 40000; var a = new Array(); <?php set_time_limit(0); for ($i = 0; $i < 40000; $i++) { echo "a[{$i}] = \"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\";\n"; } ?> // --> </script> </head> <body> <script language="JavaScript" type="text/javascript"> <!-- document.write ("--- ここから<br>"); for (i = 0; i < n; i++) { document.write (i + a[i] + "<br>"); } document.write ("--- ここまで<br>"); // --> </script> </body> </html> こんな感じでテストプログラムを作り、自宅のサーバーにアップしてテストしてみました。 サーバーは W2k/Apache2/PHP4.3.x、UP速度 400kbps クライアントは WinNT4/512MB、IE6 or Opera7 で表示テストです。 約2.5MBの htmlができあがり、そのテキストをおよそ5分掛けてブラウザが読み込みました。PHPは30秒でタイムアウトしないようにset_time_limit(0);を入れています。 IE/Opera共に時間はかかりましたが表示されました。 大きな配列、巨大なHTMLソースとなるわけで、サーバー、回線、クライアント全てに多大な負荷がかかっています。特にクライアント側はかなりメモリやCPUを消費すると思いますので、そこら辺が表示できない原因のような気がします。 #巨大な配列をJSに処理させないように別のアプローチを考えた方がいいような気がしますが、いかがでしょうか。 ブラウザで空白が出力されたときに htmlソースはありましたか?

tonka729
質問者

お礼

Yatokesa 様、またまたこんなに丁寧にみていただき感激です。(あちこちで皆さんにおねだりしている私。。。お恥ずかしい限りです。) >大きな配列、巨大なHTMLソースとなるわけで、サーバー、回線、クライアント全てに多大な負荷がかかっています。特にクライアント側はかなりメモリやCPUを消費すると思いますので、そこら辺が表示できない原因のような気がします。 #巨大な配列をJSに処理させないように別のアプローチを考えた方がいいような気がしますが、いかがでしょうか。 >ブラウザで空白が出力されたときに htmlソースはありましたか? 結論としては、こんな負担の掛かるプログラムは止めた方がいいですね。納得してあきらめます。それなら、というわけで考えましたのが、巨大なphp配列から一行だけをJSの一行文字列に変換して、クライアント側の次の要求(次の行を出せ!、とか、aで始まるphp配列の第一列を出せ!)に応じてJSに変換して表示することにしようと思います。  が、phpプログラムをHTMTLに埋め込んで活用する方法を熟知していないので、このような要求を出させるボタンなり、InputFieldなりのvalueを$inputValue = $_POST["xxxx"]としても、あとどうしたよいのか、分かりません。どの入門書にも書かれているFORM利用法というのでは、action=xxx.php をsubmit()で実行するたびに、HTML画面を書き直すようですので、inputFieldに「a 」に続けて「bout」などとキーボードから入力し続けることができませんね。 もしできれば、フォームの部品(inputFieldやボタン)にマウスやキーボードから入力した値をサーバーに送る際、画面を書き直させないようにしたいのですが、何かうまい手はないでしょうか? 次のスクリプトはまるで動いてくれませんでした。(笑) <script type="text/javascript"><!-- function send_Value_of_Inputpox() { var jsStrline; <? $inputValue = $_POST["inputbox"]; for ($i = 0; $i<$max; $i++) { if (strpos($phpArray[$i], $inputValue) ==0) { echo 'jsStrline="' . ereg_replace("\r\n","",addslashes($phpArray[$i])) . '";' . "\n"; break; } } ?> //--></SCRIPT>

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.1

全開のIDも書いていればそちらも参照するのですが… 全然勘違いかもしれません。 それは単にタイムアウトとしているだけではないですか? 画面が真っ白になるのは、php.iniで設定されている、 max_excution_time よりも処理に時間がかかっている… ってのは考えられませんか? エラーが出ずに、画面が真っ白になるそうですが、通常はエラーは出ますか? もしでないのであれば、display_errors = OFF とかなってませんか? 4000行だとできて40000行だと出来ないってのは、タイムアウトの可能性が高いと思います。

tonka729
質問者

お礼

kusukusu さま、ご回答を頂きありがとうございます。 その後もいろいろ試行錯誤をやっておりますので、すっきりとこちらの問題点をお伝えできなくて済みません。  JSで変換結果を全行にわたって表示させようとしていたので、時間が掛かりすぎてタイムエラーや「反応せず」とか、「このページのスクリプトが、Internet Explorer の実行速度を遅くしています。スクリプトを実行し続ける、コンピュータが反応しなくなる可能性があります。スクリプトを中断しますか?」というエラーが発生したのでしょうか? そこで、次のように一行だけ検査しますと document.writeln(jsArray.length+"<br>\n"); document.writeln(jsArray[jsArray.length-600]+"<br>\n"); 16000行まで瞬時に、total行数と指定行の文字列がでました。OKです。が、4万行ですると、--ここのところを正確に申し上げますね-- 何も表示ありません。エラーも出ません、ハングもしません。ということで、どうも原因がつかめません。PHPで読んだ4万、5万行の配列を、何とかしてJSの配列に変換したいのですが。。。。

tonka729
質問者

補足

私の書き込みが前後して済みません。 先ほどkusukusu さんへのお礼として書いた「エラーも出ません」は間違いでした。 「ランタイムエラー 行:3264 エラー:終了していない文字列型の定数です」というエラーが出たり、これが出ない時は,Internet Exploreの一番下のバーに一瞬「プログラムにエラーが発生しました」という趣旨の表示が現われますが、すぐ消えて、「ページを表示します」となって、結局何も表示されません。