日本PHPユーザ会 掲示板

日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。

日本PHPユーザ会 掲示板 » PHP事はじめ » PHPがCGIモードのサーバでもLast-Modifiedを取得するには?

PHPがCGIモードのサーバでもLast-Modifiedを取得するには?

ページ: 1

投稿者 投稿
会員
登録者: 9 2010
返信数: 17
sitemap.xmlやrss.xmlを自動で生成するWindowsにインストールするタイプのソフトを使っており、これを使い続けたい状況です。

しかし、問題があって使えない状況になってしまいました。それを再び使える状態にしたいです。

●Webサイトを.htmlではなく、.phpで制作
●共通部分を外部.phpファイル化しています
●上述のソフトで生成されたファイルを開くと、更新した日が一番上にくるはずなのにそうならず、
 よく見ると、全てのページの更新日時が同じになっている。
 これでは更新順にページが並ばず、まるでウソのRSSファイルになってしまう。

●ソフトはWebサーバからでもローカルからでも更新日時を取得できるが、事情あってローカルはダメ。

●Webサーバから取得しようとすると取得できない。
 Last-Modifiedで更新日時を取得しているソフトだそうだが、製作者いわく、サーバがモジュールモードならば.htaccessに一行追加するだけで再び使えるようになると。
 が、利用サーバはCGIモード。

PHPがCGIモードのサーバでも、自動生成ソフトが再び使えるようになる方法が何かないでしょうか?
「トップページと同じ階層に○○と記述した.phpファイルをアップすればできるよ」
など、何か方策あると大変大変助かります。
プログラミングは全くの初心者ですが何卒宜しくお願い致します。
« 最終編集者 whatsthestory 日時 2010 年 9 月 2 日(木) 18:18. »
会員
登録者: 8 2009
返信数: 103
こんばんは、
取り急ぎレスポンスしますが、phpからhttpヘッダーでLast-Modifiedを明示的に返すようにしてみてはどうでしょう?
会員
登録者: 9 2010
返信数: 17
nullaさま、ありがとうございます!

済みませんがおっしゃってることが、いったい何をどうすればいいのかプログラミング初心者なので何もわかりませんでした。
検索しても出ないのですが、ひとつ見つけたサイトで、

http://dara-j.asablo.jp/blog/cat/php/?offset=10

以下のような記載がありました。

「Last-Modified = "Last-Modified" ":" HTTP-date」

すでに記載したとおり、当方の状況の場合、
●ソフトを使い続けるようにするのが目的
●当然ソフト自体を改造することはできない
●PHPファイルや他のファイル等、Webサーバにアップロードするファイルに何か仕込む的な手法を想像している

こんな感じなのですが、上述の、

「Last-Modified = "Last-Modified" ":" HTTP-date」

を、外部化・共通化した.phpファイル(例:sidebar.php。サイドバーの個所だけが記載された外部ファイル。サイドバーのページリンクを増やしたり、変更・削除がここをいじるだけで終了できる)の冒頭に記述するとかでしょうか??

初心者なため、記述してサーバが壊れてサイトが表示されなくでもなったら恐ろしいことになるので、わからず試すのも無理がありまして・・・

済みません、書いてあることを具体的にどうやればよいのかまるで知らないので、たぶん見当違いとは思いますが自分で調べるとこんな感じくらいしか思いつきませんでした。
もしよろしかったら、何のファイルにどうやれば良いか教えていただけましたらとても助かります。
会員
登録者: 8 2009
返信数: 103
おはようございます。

sidebar.phpの上部辺りに
<?php

$mtime = filemtime($_SERVER["ORIG_PATH_TRANSLATED"]);
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $mtime) . " GMT");

?>

httpレスポンスヘッダを確認してみてください。
Last-Modifiedがあるはずです。
会員
登録者: 9 2010
返信数: 17
nulla様、申し訳ないです、私の無知により説明が悪かった気がしております。それの補足説明と、やってみての結果をお伝えします。

(1)説明が悪かったので補足
バカでした。サイドバーの外部ファイルでsidebar.phpとすればわかりやすくなると思ったのですが、見当違いでした。
あくまでも更新日時を取得したいのは、「公開した新たに製作したページや、すでにあるページを編集・上書きしたページ」ですから、
サイドバーではなかったです。サイドバーが実際に更新されるのは「常にではない」のが正しいのに。

なので、更新したかどうかを知らせたいファイルというのは、
●外部ファイルではない大元の.phpファイル。例:製品Fのページを新たに公開したのなら、/item/item-f/index.php
●更新されたことを知らせたい外部ファイル。例:製品Fのページに直接記述せず、使い回しできるように外部ファイル化している、「製品A~製品F」をゆききするサブリンクボタンの部分だけが記述されている外部ファイル。

ということだとやっと理解しました。




(2) ということで以下のようにやってみましたが、ページを更新するとエラーメッセージのようなものが出ました。

●sidebar.phpは関係ないと理解できたので、新たに公開した製品Fの.phpページの以下の場所に教えていただいたソースを入れた
------------------------------------------------------
<?php echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; ?>
<?php

$mtime = filemtime($_SERVER["ORIG_PATH_TRANSLATED"]);
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $mtime) . " GMT");

?>
<?php include_once("../../cmn/inc/doctype.php"); ?>
<head>
<?php include_once("../../cmn/inc/head.php"); ?>
------------------------------------------------------


●そのうえで該当URLを開いたら、ページデザインの一番上に以下のようなメッセージが出た
------------------------------------------------------
Warning: Cannot modify header information - headers already sent by (output started at /serverpass/www//rentalserver/myid/mysite.com/item/item-f/index.php:1) in /serverpass/www/rentalserver/myid/mysite.com/item/item-f/index.php on line 6
------------------------------------------------------

「headerはすでに送っているぞ」
とは、Last-Modifiedと何の関係があるのかな・・・・

ご迷惑おかけしております・・・・・・
会員
登録者: 8 2009
返信数: 103
> (1)説明が悪かったので補足
そのことは考慮済です。
include_once()で取り込む時点でindex.php(外部ファイルではない大元のphpファイル)のLast-Modifiedを返します。
sidebar.phpでなくとも別のファイルに記述しておけばいいと思います。

> (2)
> <?php echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; ?>
内容を送出した後なのでヘッダは送れなくなるのですよ。
これより上に記述するかinclude_once()してみてください。
会員
登録者: 9 2010
返信数: 17
ありがとうございます。

> そのことは考慮済みです

なんと! そこまで考えていただいたいたのですか・・・
ありがとうございます。


> これより上に記述するかinclude_once()してみてください。

include_once()のほうは、例えば「last-mod.php」などとして外部ファイル化し、そこにご案内のソースを入れる、
ということだと理解しました。そうやってもいいんですね。


そういうことだったのか、ということでひとまず「これより上に記述」のほうでやってみました。要は一番最初にもってきたことになりました。
index.phpという大元ファイルの。

そうしましたところ、ソフトを起動して「Webサイトから取得」をやってみましたところ、確かにこのindex.phpのファイルだけ更新日時が変わりました。
しかし、なんででしょうか・・・・
1970-01-01
09:00:00
と出ました。
いじっていない他のすべての.phpは、相変わらず「Webサイトから取得」を実行した本日只今の日時が更新日時として出ていました。
ウ~ン・・・・なんで40年前の9時丁度に??

試しに、sidebar.phpの冒頭にも同じソースをアップした状態でやってもみましたが、
やはり結果は同じでした。
« 最終編集者 whatsthestory 日時 2010 年 9 月 3 日(金) 14:29. »
会員
登録者: 8 2009
返信数: 103
環境に依存するようですね。
こちらではうまくいくのですが。

$mtime = filemtime($_SERVER["ORIG_PATH_TRANSLATED"]);

おそらく $_SERVER["ORIG_PATH_TRANSLATED"] の値がうまくとれていないのでしょう。
phpinfo()で PHP Variables の表をみてください。
その中に元のphpファイルをフルパスで指し示している環境変数があるはずです。
ORIG_PATH_TRANSLATED のかわりに使ってみてください。

こちらでは _SERVER["SCRIPT_FILENAME"] も同じ値です。
会員
登録者: 9 2010
返信数: 17
当方にプログラミングの知識がなく、何度もアドバイスいただくことになってしまっています。
ただただ感謝です。

さて、意味自体がわからず探しましたが、ただ単にサーバにphp infoの呪文を書いた.phpファイルをアップして、それをブラウザで開けばValiablesの情報が勝手に出てくれる、というものなのですね!
やっと意味がわかってきました。
が、Valiablesっていっぱいあって、お指図のものがいったいどれなのかわからない状態でして、めぼしいものをやってみました。

しかし妙なのです。ソフトで更新日時を取得実験しましたところ、
試したファイルだけが18:47となっていて、あとのファイルは実験した時間である19:02とかなっています。ただし、試していないさわっていないファイルもちょっとおかしくて、これまでは時間までまるで一緒だったのに、今回の実験ではひにちは今日になっているものの、時間が秒単位で微妙にズレています。

今までは、すべてのファイルがどれも、ひにち・時間・秒まで同じだったんですが。。。

Valiablesに書いてあったのは以下です。
※PHPRCとか、HOMEとか、固有っぽい情報は当然仮の情報に書き換えています。
 また、どうみても関係ないのもはぶいています。
 PHPRC、HOME、SCRIPT_FILENAMEは試したのですが・・・

------------------------------------------------------
_SERVER["REDIRECT_STATUS"] 1
_SERVER["PHPRC"] /www/jp/rentalserver/myid/mysite.com
_SERVER["HOME"] /www/jp/rentalserver/myid/mysite.com
_SERVER["PATH"] /usr/local/bin:/usr/bin:/bin
_SERVER["HTTP_HOST"] www.mysite.com
_SERVER["SERVER_NAME"] www.mysite.com
_SERVER["DOCUMENT_ROOT"] /export/cgi
_SERVER["SCRIPT_FILENAME"] /www/cgi/jp/www.mysite/phpinfo.php
_SERVER["GATEWAY_INTERFACE"] CGI/1.1
_SERVER["SERVER_PROTOCOL"] HTTP/1.1
_SERVER["REQUEST_METHOD"] GET
_SERVER["QUERY_STRING"] no value
_SERVER["REQUEST_URI"] /phpinfo.php
_SERVER["SCRIPT_NAME"] /phpinfo.php
_SERVER["PHP_SELF"] /phpinfo.php
_SERVER["REQUEST_TIME"] 1283507279
------------------------------------------------------

なんどもすみませんホントに......
« 最終編集者 whatsthestory 日時 2010 年 9 月 3 日(金) 20:40. »
会員
登録者: 8 2009
返信数: 103
こんにちは。
最後の書き込みを読む限り齟齬があるのではと今までの記事を読み返しましたが
もう解決してるかあと一歩かもしれません。

> しかし妙なのです。ソフトで更新日時を取得実験しましたところ、
どのように記述したのか正確な情報がないので明確に説明できませんが、
Last-Modifiedを追加するためにファイルを保存したので
その保存した時間の更新日時が取得されていると考えられませんか?
「製品A~製品F」のファイルを1時間毎に更新すれば1時間毎の更新日時が返されると思うのですが。
更新日時を変更するソフトウェアを使って試してみるのもいいかもしれません。
ただわからないのはさわっていないファイルのLast-Modifiedが秒単位の相違で返される点ですね。

環境変数は SCRIPT_FILENAME でいいと思います。

差し支えなければsitemap.xmlやrss.xmlを自動生成するソフトウェアを教えていただけますか?
それとftpかscpの使用されてるソフトウェア、どこのサーバなのか。
こちらはさくらのサーバでphpはcgi-modeなので検証できます。



# 1点気になるのですが、gmdate()はグリニッジ標準時を返すはずなのに
# 1970-01-01 09:00:00 と日本時間を返しているように見えます。
会員
登録者: 9 2010
返信数: 17
nullaさま、仰るとおりで解決に向かっているようです!

どうやらUTF-8のボム無しにしたつもりのlast-modified.php(nullaさまご指南のソースが入った)が、何故かShift-JISか何かに変わってしまっていたのが原因なのか、改めてUTFに保存しなおししてアップしたら、正常になったみたいです。
last-modified.phpを仕込んだ.phpファイルだけが過去の日付になっており、かつ、それぞれアップした日時になっているようです。
仕込んでいない.phpファイルは相変わらずアップした日時が出ていました。
EmEditorでUTF-8のボム無しにした外部ファイルを複製して作成しているのですが、何故だか勝手にUTFでない形式に変わることがちょこちょこあって、どうやらこれが原因かと感じております。

# 1点気になるのですが、gmdate()はグリニッジ標準時を返すはずなのに
# 1970-01-01 09:00:00 と日本時間を返しているように見えます。

これも本件によって解決したもようです。


全ファイルにinclude_once記述をやっていこうと思うのですが、どうせやるならば
「どの階層のウェブページ(.phpファイル)を開いても、include_onceやincludeの外部ファイルを指定するパスが一定で良い方法」、
つまり、階層が変わっても.phpファイルに記述するソースを一切変えずにいれる方策を解決してから、全ファイルに適用が必要な場合を想定して本件の記述も同時にやってしまおうと思っております。

何度もアドバイス(というかもはや正解そのもの)をしていただき、本当に助かりました!
« 最終編集者 whatsthestory 日時 2010 年 9 月 6 日(月) 17:24. »

ページ: 1

日本PHPユーザ会 掲示板 » PHP事はじめ » PHPがCGIモードのサーバでもLast-Modifiedを取得するには?

日本PHPユーザ会 掲示板 は UseBB 1 フォーラムソフトウェア を使用しています