- ベストアンサー
ウエブページにssiで挿入されるコンテンツの更新を「ブラウザに対してこのページの送信が行われる期間以外」に行う方法
一部のコンテンツがssiで挿入されるウエブページを生成する場合、 「ブラウザに対してこのウエブページの送信が行われている期間を避けて、上記コンテンツを更新する」には、 phpやjavascriptでどのような処理をすればよいか教えて下さい。 なお、ブラウザに対する送信は、コンテンツの更新の前と後との何れで行われても結構です。 以上、よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
うーん・・そもそも仕様として「ちゃんと考えてない感」が強いのですが(汗 とりあえずSSIでの挿入を単純なファイル読み込みでなく、execでCGIの実行結果取り込みにしてCGI側に排他制御(待ち合わせ)を組み込むくらいですねぇ。CGIは単にファイルを読んで(このときに排他をチェック)そのまま返すだけでいいですね。
その他の回答 (2)
- shimix
- ベストアンサー率54% (865/1590)
>上記スクリプトについては、execコマンドによる起動時にurlに「?」と「所望の値」を >付加することにより、パラメータを引き渡そうとしたのですが、どうも無理なようです。 execは「exec cgi」か「exec cmd」のどちらでしょうか?普通のCGIのように環境変数から値を取得しようとされてませんか?引数(argv)で渡すようにしてみては?
お礼
度々、そして早々と教えて頂きありがとうございます。 早速、引数(argv)で引き渡すように試みてみます。 これからも、どうかよろしくお願い致します。
- shimix
- ベストアンサー率54% (865/1590)
>phpやjavascriptでどのような処理をすればよいか教えて下さい。 phpはまだしも、JavaScriptでサーバのファイルを更新した経験がありません(汗 ファイルの更新に時間がかかるとは思えないのですが、どの程度の時間がかかって困っていらっしゃるのでしょうか?もしDB処理などで「数十秒程度かかる」のであれば、いったん別ファイルに書き出しておいてからコピーするとかではダメなんですか? #コピーでダメならFTPで転送しても同じことなので・・
補足
早速の回答、ありがとうございます。 ssiで挿入されるコンテンツは、ブラウザによりアクセスされたとき所定(本件には関係がないため省略)の条件で更新されるテキストファイル(内容はhtml)です。 サイズは、数キロバイト、更新に所要する時間はきわめて短いものと思われます。 現状では、このテキストファイルは、 phpスクリプト(ブラウザによりアクセスされたことをきっかけとして起動される)により更新されますが、 このように更新されている期間にも、 ブラウザ(先にアクセスしたブラウザだけではなく、遅れてアクセスした他のブラウザを含む)に対して、 ssiによる送信が並行して行われてしまうようです。 すなわち、テキストファイルのアクセスに関する排他制御ができていないと思われます。 現状では、phpのflock関数を用いて排他制御を行い、 さらに、stream_set_write_buffer関数により書き込みバッファサイズを「0」としていますが、 症状は改善されず、どうも、サーバサイドでは、phpと、ssiによる送信のための読み出しとの間に、排他制御が成立していないものと思われます。 そのために、ブラウザ画面上では、レイアウトの崩れ等が生じています。(ブラウザで受信されたソースでも確認) ブラウザが1つだけであれば、onloadイベントを検出して、getメソッド等によりサーバサイド(php)に送信の完了を通知させることができますが、 実際には複数のブラウザがランダムに並行してアクセスする可能性が高いため、コンテンツの更新を行ってもよい期間をどのようにして検出してよいものか、困っております。 サーバサイドで該当ページの転送が行われていない期間が識別できるならば、それが最良とおもわれるのですが、自力ではどのようにしてよいかわかりません。 以上をふまえて、よい方法がありましたら、教えて頂きたく、よろしくお願い致します。
お礼
ssiのコマンドをincludeに代えてexecとし、 これで起動されるphpスクリプトで排他制御とファイルの内容を出力する処理を盛り込む ことにより、解決しました。 お忙しいところ、早々に適切なご指導を頂きありがとうございました。 もし可能でしたら、以下の点を併せて教えて頂きたく、よろしくお願い致します。 上記スクリプトについては、execコマンドによる起動時にurlに「?」と「所望の値」を付加することにより、パラメータを引き渡そうとしたのですが、どうも無理なようです。 したがって、パラメータのとり得る個々の値に対応した複数のスクリプト(主要部が同じ)を作ることも止むを得ないようです。 パラメータのとり得る値が多い場合にも、よりスマートかつ確実にパラメータを引き渡す方法がありましたら、是非教えて下さい。