質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1749閲覧

PHP DateTime diffを使った日付比較処理

narui

総合スコア62

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/05/23 01:56

前提・実現したいこと

いつもお世話になっております。
前回、PHPでの日時比較の際にアドバイスいただいことを参考に今度は3時間おきにサーバーにあるtest.htmlのデータを更新したいと思っています。
色々と調べながら、動作については実現することができたのですがそもそもの考え方として下記1、2の方法はどちらが
適していますか?
もしくはもっと効率の良いスマートな書き方があるなどご教授いただければと思います。
※使用サーバーはCronが使えません。

考え方1:
$now(現在時刻)と$targetday(更新時刻)をDateTimeで取得しdiffで日時の差分を抽出して経過3時間以上ならファイルを更新する。

該当のソースコード

PHP

1$fname = "test.html"; 2$now = (new DateTime())->setTimeZone(new \DateTimeZone('Asia/Tokyo')); 3$targetday = (new DateTime('@' . strval(filemtime($fname))))->setTimeZone(new \DateTimeZone('Asia/Tokyo')); 4 5$dteDiff = $now->diff($targetday); 6 7if (($dteDiff->format("%H"))>3){ 8 echo '更新中'; 9 10} else{ 11 echo '3時間経過していません'; 12} 13

考え方2:
$now(現在時刻から3時間前をセットする)と$targetday(更新時刻)をDateTimeで取得し、$targetdayより$nowが大きかったら?(先の日時だったら?)更新する。

該当のソースコード

PHP

1$fname = "test.html"; 2$now = (new DateTime())->modify('-3 hours')->setTimeZone(new \DateTimeZone('Asia/Tokyo')); 3 4$targetday = (new DateTime('@' . strval(filemtime($fname))))->setTimeZone(new \DateTimeZone('Asia/Tokyo')); 5 6if ($now>$targetday) { 7   echo '更新中'; 8} 9

試したこと

どちらのコードも動くは動くのですが、teratailでアドバイスいただいたりネット検索などで調べながら書いているので正解がわかりません;
if文のあたりもシンプル過ぎてこれでいいのかと不安なので書き方がおかしい部分などご指摘、ご教授いただけるとありがたいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/05/23 02:03

ファイルの何を更新するのでしょうか?Cronが使えないとなると、このPHPコードを自動で実行する手段がなく、アクセスしない限り何日も何時間も更新されないという事態になるように思うのですが、いかがでしょうか(前の質問で気づけばよかったのですが・・)
narui

2018/05/23 02:24

そうなんです、Cronが使えないのでどうしようかと考えた結果このような方法でチャレンジしているところで;サイトA(1日に複数回アクセスが必ずあります。)にアクセスがあった時このPHPファイルを実行するようにしています。サイトAとサイトBで同じ更新履歴記事を載せたいと思い、test.htmlにはサイトBで更新された更新履歴を一時的に取り出して書き込んでいる感じなのですが...
m.ts10806

2018/05/23 02:27 編集

JavaScriptでsetTimeoutなどを使ってAjaxから定期実行して・・・というのもないわけではないですが、結局ブラウザ立ち上げっぱなしじゃないといけませんしね。Jenkinsとかも検討してみては?https://qiita.com/shuntaro_tamura/items/c759bc318859a1203211 サーバーがWindowsであればタスクスケジューラという手もあります。
narui

2018/05/23 05:56

ありがとうございます。レンタールサーバーなのでJenkinsは使えないかもしれませんがCronのようなことができそうですね!調べてみたいと思います。
guest

回答1

0

ベストアンサー

経過時間を算出して閾値を超えているかの比較と、
実行予定日時を算出しておいて現在日時との比較、
どっちも同じようなもんだし、
ミリ秒単位の高速化を考えなきゃいけない場面でもないから、
「お好きなように」

DateTime型を使わずUnixtime(int型)で比較するのも
「お好きなように」

WordPressで使っている疑似cronの考え方も面白いですよね。
WordPressで擬似cronを使ってバッチ処理を定期実行させる方法 | コワーキングスペース7F

投稿2018/05/23 02:06

編集2018/05/23 02:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

narui

2018/06/15 07:46

コメント遅くなりすみません; WordPressで使っている疑似cronの考え方もとても参考になりました。 理想の形に近づけそうで近づけませんが、勉強していきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問