PHPについて質問です。


下記のスクリプトは
「当該ファイルが存在しなければ
  ①ファイルを新規で作成、
  ②test2.php のPHPスクリプトを実行した結果として出力される内容を保存
  ③HTTPヘッダを送信する」
というスクリプトです。

if(file_exists($hoge)==false){
$fl = fopen($hoge,"a+");
ob_start();
include('test2.php');
$contents = ob_get_contents();
ob_end_clean();
fputs($fl,$contents);
fclose($fl);
}
header("Location: " . $hoge);

上記のスクリプトに、
「当該ファイルが存在した場合、
  ①毎月1日以降を過ぎてからスクリプトを実行した場合上のスクリプトの②を実行
  ②それ以外は何もしない」
というスクリプトを付け加えてください。
つまり、このスクリプトで実行したファイルを定期的に更新したいのです。

なお、質問者はまだPHPの学習を初めて間もない初心者なので、
自分のやりたいことをうまく質問することもままなりません。
不明瞭な場合はその旨コメントをいただければ幸いです。
なお、回答はコピペしてそのまま使えるものをお願いします。

以上、よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/02/19 13:35:18
  • 終了:2008/02/19 16:23:50

回答(3件)

id:tezcello No.1

tezcello回答回数460ベストアンサー獲得回数692008/02/19 14:24:19

ポイント36pt

「当該ファイルが存在した場合、

  1.毎月1日以降を過ぎてからスクリプトを実行した場合上のスクリプトの②を実行

  2.それ以外は何もしない」

というスクリプトを付け加えてください。

(機種依存文字は置換えました)

a.ファイルが存在しない場合は、test2.php の実行結果を、そのファイル名で書きこむ

b.ファイルが存在する場合でも、スクリプトの実行された日にちが2日以降であれば上記と同じ


という事だと思います。

if(file_exists($hoge)==false or date('j') > 1){
$fl = fopen($hoge,"a+");
ob_start();
include('test2.php');
$contents = ob_get_contents();
ob_end_clean();
fputs($fl,$contents);
fclose($fl);
}
header("Location: " . $hoge);

のようにすればよいでしょう。

ですが

> つまり、このスクリプトで実行したファイルを定期的に更新したいのです。

毎月1日このスクリプトを実行すると全く更新されない事になりますが大丈夫ですか?

id:taroemon

ご回答ありがとうございます。

いつも本当に助かってます。


PHPの質問と言うよりは日本語がおかしいですね。

作成されたファイルを一ヶ月に一回くらい更新したいというのが、この質問の意図です。

したがって、それをくんでいただければどのようなものでもかまいません。

1日がだめというなら2日以降に実行します。というお返事で大丈夫でしょうか?


コメント欄にもお返事しておきました。

またお気づきになられたことがありましたら、お時間のあるときにでもお返事ください。

2008/02/19 15:39:07
id:Numeric No.2

Numeric回答回数83ベストアンサー獲得回数182008/02/19 14:51:31

ポイント36pt

これで動くはずです。


//ファイルがないか、ファイル更新月の当月でなければ
if( ( ! file_exists($hoge) ) || ( date("Ym",filemtime($hoge)) !=  date("Ym") ) ){
	//ファイルがあってもなくても新規作成
	$fl = fopen($hoge,"w");
	ob_start();
	include('test2.php');
	$contents = ob_get_contents();
	ob_end_clean();
	fputs($fl,$contents);
	fclose($fl);
}
header("Location: " . $hoge);

filemtime($filename));
id:taroemon

ご回答ありがとうございます。

勉強になりました。

2008/02/19 15:40:11
id:blueberrystream No.3

KID the Euforia回答回数34ベストアンサー獲得回数52008/02/19 15:57:58

ポイント36pt

要件があまりはっきりとわからないのでコメントでのご回答とご質問の文言通りに作りました。

やっていることはスクリプトの実行日時を保存しておいて比較するというものです。

<?php
// スクリプト実行日時保持ファイル名
$time_file = 'last_time';

/* 1. 当該ファイルが存在しなければ */
if (file_exists($hoge) == false) {
    /* 1-1. ファイルを新規で作成 */
    $fl = fopen($hoge, "a+");
    
    /* 1-2. test2.php のPHPスクリプトを実行した結果として出力される内容を保存 */
    /*ob_start();
    include('test2.php');
    $contents = ob_get_contents();
    ob_end_clean();*/
    //fputs($fl, $contents);
    fwrite($fl, "hogeファイルです");
    fclose($fl);
}
else {  /* 2. 当該ファイルが存在した場合 */
    /* 2-1. 毎月1日以降を過ぎてからスクリプトを実行した場合上のスクリプトの②を実行 */
    // 前回スクリプト実行日時を取得
    $last = 0;
    if (file_exists($time_file)) {
        $handle = @fopen($time_file, "r");
        $last = fgets($handle);
        fclose($handle);
    }
    else {  // 日時保存ファイルがない→初回起動
        $last = -1;
    }
    // 月を比較
    if (date('M') != date('M', $last) || $last = -1) {
        // 月が違えばその月で最初の起動
        // 1-2. test2.php のPHPスクリプトを実行した結果として出力される内容を保存
        ob_start();
        include('test2.php');
        $contents = ob_get_contents();
        ob_end_clean();
        fputs($fl, $contents);
        fclose($fl);
    }
    else {
        // 2-2. それ以外は何もしない
        // このelseブロックはなくてもいいです
    }
}

// スクリプト実行日時を保存
$handle = @fopen($time_file, "w");
fwrite($handle, time());
fclose($handle);

/* 1-3. HTTPヘッダを送信する */
header("Location: " . $hoge);
?>
id:taroemon

ご回答ありがとうございます。

私の質問の仕方が不明瞭で済みません。

これを参考にしてがんばってみようと思います。

2008/02/19 16:23:19
  • id:blueberrystream
    >①毎月1日以降を過ぎてからスクリプトを実行した場合
    これは「その月で初めてスクリプトを実行する場合」という解釈でよろしいでしょうか?
    それとも言葉通り「毎月1日以外にスクリプトが実行される度に」でしょうか?
  • id:tezcello
    サーバはローカルにあって、しかもそのサーバ上でブラウザを起動しているように思われますが、いかがでしょうか?

    もしそうなら、定期的に何かをやりたいなら、cron という手もあります。
    毎月1日の午前1時に実行する なんてのが簡単に設定できます。
    もちろん実行するのがPHPスクリプトでも構いません。
  • id:taroemon
    blueberrystreamさん
    「その月で初めてスクリプトを実行する場合」ということで、
    「一日以外」ということにはまったくこだってません。
    ファイルの内容を定期的に更新するということだけを目的としているので、
    それを満たしていればどのようなものでもかまいません。


    tezcelloさん
    >サーバはローカルにあって、しかもそのサーバ上でブラウザを起動しているように思われます
    そののとおりです。
    環境的にはXAMMPで実行し、Firefoxで起動しています。
    ただし、セキュリティ対策まで勉強し終わった後、WEBサーバーに転送する予定です。

    >定期的に何かをやりたいなら、cron という手もあります。
    貴重なアドバイスありがとうございます。
    理想的には定時に自動的に更新されるのが望ましいです。
    その場合、更新すべきページが多い場合、サーバーには大きな負担がかかるのでしょうか?
    もしお時間があるようでしたらcronを使った場合のPHPスクリプトもご回答ください。
  • id:blueberrystream
    すみません、3の回答をした者です。
    回答のコードにテストコードが残っていました。

    /*ob_start();
    include('test2.php');
    $contents = ob_get_contents();
    ob_end_clean();*/
    //fputs($fl, $contents);
    fwrite($fl, "hogeファイルです");

    の部分です。

    ob_start();
    include('test2.php');
    $contents = ob_get_contents();
    ob_end_clean();*/
    fputs($fl, $contents);

    として元に戻してください。申し訳ありません。
    それと、要件がはっきりしないのは私の日本語力が足りないせいでもあるので
    あまり気になさらないでください。
    ただ、できかけのソースコードがあるなら、それにコメントをはさんで
    なにをしたいのかを書き込んでいくと、そのソースでなにをしたいのかが
    はっきりしてくるかもしれません。
  • id:tezcello
    > 作成されたファイルを一ヶ月に一回くらい更新したいというのが、この質問の意図です。
    でしたら、スクリプトを実行した時の年・月と、ファイルを更新した時の年・月を比較されている2番目の回答者さんのスクリプトがご希望のものではないでしょうか?

    ただし、毎月、全てのファイルについて、実行しなければならないですね。

    cron でやるのは現実味が出てきますが、他の利用者とサーバを共有している場合は、処理の内容によっては大迷惑になる可能性があります。(レンタルサーバによっては、PHPの動作時間を○秒以下としている所もあるようです)また、そもそもcronを解放していないところの方が多いのではと思います。

    外部からのアクセス数がそれ程多くないのなら、ローカルに別途サーバを立ててしまった方が自由度は上がります。
    セキュリティに気を付けなければなりませんが、Webサーバ位ならそれ程難しくないと思うのですが。

    ホスティングだろうが自宅サーバだろうが、処理は軽い方がよいのは間違いないでしょう。
    ですから、一つ一つファイルにして保存しておく現在の方法が最適なのかも含めて検討が必要になるかも知れません。(例えば、単なるリンク集とリンク切れの定期チェックなら、1リンク1ファイルでは負荷が高すぎるような気がします。リンク切れのチェックはタイムアウト短く設定するとレスポンスの悪いサーバをみんなご判断しますし、長くすると、PHPスクリプトのタイムアウトに引っ掛りそうです)

    > もしお時間があるようでしたらcronを使った場合のPHPスクリプトもご回答ください。
    cron は、指定した時間になると、指定した動作をするというだけで、スクリプト本体は特に変わった事をしなくてもOKです。ただし、ブラウザで閲覧する事を前提にした諸々は、当然ながら無意味です。(HTTPヘッダを返すとか、formから何かを受け取るとか...)
    cron 自動 実行 などのキーワードでググると色々ヒントが見つかると思います。
    http://www.google.co.jp/search?hl=ja&q=cron+%E8%87%AA%E5%8B%95%E3%80%80%E5%AE%9F%E8%A1%8C&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
    例えば、
    http://tsuttayo.sytes.net/crond/
  • id:taroemon
    blueberrystreamさん
    再度のコメントありがとうございます。
    私は作ったコードを世に公表するのはとても恥ずかしいので、
    ちょっと躊躇しますが、もう少し勉強したらそうすることにします。

    tezcelloさん
    たくさん教えてくれありがとうございます。
    辛抱強く教えていただいてるので、
    コメント、ご回答をいただくたびにちょっとずつわかってくる感じがします。

    >ただし、毎月、全てのファイルについて、実行しなければならないですね。
    ファイルは実行された時に更新されればよいので、
    実行されないファイルはそのままでもいいです。
    ということをあらかじめ書いておくべきでした。

    cronは負担になりそうなのでもう少し勉強してから、
    導入を検討することにします。
  • id:tezcello
    > 私は作ったコードを世に公表するのはとても恥ずかしいので
    僕も同じです。ですが、提示したスクリプトの不都合な点や間違いを指摘してもらうと何倍も勉強になります。

    > cronは負担になりそうなのでもう少し勉強してから、
    サーバにとって、負荷であるのは間違いないですが、重すぎる負荷なのかは???ってところですね。
    更に、データの持ち方でも負荷は軽減できるので、よく検討する方がいいでしょう。
    質問者さんの勉強の負担になるというお話でしたら、ごめんなさい。

    手元にサーバをたててみるのはとても有益だと思います。より実際に近い状態でチェックできますし。
    XAMPPは簡単でテスト環境としては素晴らしいとは思いますが、あくまでローカルなので、ネットワーク的にはひょっとしたら実際の動作としてはNGな場合を見落とさないかが不安です。
    具体的には、HTTPヘッダを返す時に、ローカルのファイル名のみを返していますが、
    本来は絶対アドレスを返す事になっています。
    現状でうまく動作しているようですが、外部からのアクセスの場合は?とチョッと不安です。
    (外部のマシンも自分のローカルなファイルを見にいってしまうのでは?と思っているのです)
  • id:taroemon
    >提示したスクリプトの不都合な点や間違いを指摘してもらうと何倍も勉強になります。
    おっしゃるとおりですね。貴重なアドバイスをありがとうございます。
    ご意見をいただけるというのは私にとっても大事なことなので、なるべく公表することにします。

    >質問者さんの勉強の負担になるというお話でしたら、ごめんなさい。
    そんなことはありません。今はまだ勉強し始めたばかりなので、
    何ができるのかさえわかっていない状態なので、
    可能性を示唆していただけることは私にとってありがたいことなので、
    またなにかありましたら教えてください。

    >手元にサーバをたててみるのはとても有益だと思います。
    わかりました。私もcronの話をいただいてから必要かなと思うようになってたところなので、
    また、チャレンジしてみようと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません