• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Cronでdate()を実行して一部の拾えない時間)

PHP Cronでdate()を実行して空白時間が発生する問題について

このQ&Aのポイント
  • PHPを勉強中の方がCronでdate()を実行しても空白の時間ができてしまう問題に困っています。具体的には、昨日の日付のみを抽出する形で当日の夜0:30に実行していますが、9:00〜0:30の時間帯の一部のデータが拾えません。
  • 自分のパソコンのxamppでテストした場合は問題なくデータを拾えますが、さくらサーバーにPHPファイルを置いてcronに設定すると、9:00〜0:30の時間帯のデータを拾ってくれません。
  • なぜ9:00〜0:30の時間帯のデータを拾えないのか原因が分からず、困っています。PHPに詳しい方からのアドバイスをお待ちしています。

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>$yesterday = date('D M d', strtotime('-1 day')); これって(たとえば)"Tue Mar 05"といった文字列ですよね?これと提示されている文字列をどのように比較されているんでしょうか? 文字列としての「含む・含まない」とは違う比較方法じゃないかと推測するのですが(データベースに格納されている日付時刻値とか)。文字列でなく日付時刻として比較すると、提示されているのがGMT(+0000)ですからJST(+0900)とは「9時間の時差」があります。 #xamppは明示的にDateTimeZoneをTokyo/Asiaに #指定しないとJSTにならなかった気がするので・・・

walsch
質問者

補足

agunuz様。回答ありがとうございます。 そうです。言葉足らずで申し訳ございませんでした。 TwitterAPIにて一日前の日付のみ抽出したいと試みて練習しています。 文字列の「含む・含まない」は、 $yesterday = date('D M d', strtotime('-1 day')); if (preg_match( "/$yesterday/",$val->created_at)) { : のように比較しています。 御指摘の通り、 9:00(朝)~0:30(夜)→この時間のある記述は拾う 0:30(夜)~9:00(朝)→この時間のある記述は拾ってくれない …なので、おそらく仰る通り、9時間の時差分が抽出されていないのだと思います。 そこでここ数日、調べつつ試行錯誤してみたのですが、どこで調節すればいいのか分からず暗礁に乗り上げてしまいました。 例えば、 $yesterday = date('D M d', strtotime('-1 day -9 hour')); だと →2日前全部と1日前0:30(夜)~9:00(朝)の日付のみ拾ってしまう ・1日前の拾わなかった時間を拾ってくれるが、9:00(朝)~0:30(夜)を拾ってくれない。なによりも2日前の日付を全部抽出したいわけではないのでダメ 時差の方を調節するのかと思い、 if (preg_match( "/$yesterday/",$val->created_at) - 9*60*60) だと →3日前の途中と2日前全部と1日前全部の日付のみ拾ってしまう ・1日前の全部の時間を拾ってくれるが、なぜか3日前から2日前全部から1日前全部まで拾うのでダメ …それなのになぜか両方ともタイムスタンプされて表示される時間は、ツイートをした日本時間で間違いなく合致しています。 しかしなぜか、0:30(夜)~9:00(朝)の時間帯のみのタイムスタンプを $yesterday = date('D M d', strtotime('-1 day')); は無視するようです。 + 9時間の時差が補正される前に対して、-1 day の命令が行ってしまっていることは分かるのですが、どこを修正すればいいのか分からず困っています。 お手数でなければご教示頂けたら幸いに存じ上げます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • TwitterAPIでの時差の調整(日本時間に)

    唐突に質問失礼致します。TwitterAPIを勉強中の者です。 時間の文字列を照合して「今日の分のツイート」を取得しようとしているのですが、夜0:00~朝9:00まであたりの時間が抽出されずに無視されてしまい困っています。 おそらく9時間の時差分が抽出されていないと思いますが、どう+9時間の時差を書き加えればいいでしょうか? 現在は、下記のような形で当日の夜23:59に実行しています。 jsonで取得し、 $today1 = strtotime("now"); $today2 = date('D M d', $today1); //////$today2 = date('D M d', strtotime('now'));←1行で書くとこんなかんじです///// foreach ($tweets as $val) { if (preg_match( "/$today2/",$val->created_at)) {   : これだとGMTになってしまうのか、仮に1時間に1回のツイートをしていたとしても、夜0:00~朝9:00のみの時間帯だけ無視されます。 どこに日本時間の+ 9*3600を書き加えれば、修正されるでしょうか? サーバーはさくらサーバーに置いてcronで実行しています。 改善法をご存じの方がいらっしゃいましたらご教示頂けたら幸いに存じ上げます。

    • ベストアンサー
    • PHP
  • cronの設定について

    cronの設定方法について教えてください。 cronに設定したコマンドが実行されません。 OS Linux 2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux rootでcrontab -e を実行し次のように記述しました。 * * * * * touch /tmp/cron_test_`date +%Y%m%d%H%M%S` 上記の設定を記述後、念のため「service crond restart」を実行しました。 しかし、/tmp/cron_test_`date +%Y%m%d%H%M%S`は作成されません。 どうしたら良いでしょうか。 ご存知の方、どうか設定方法を教えてください。m(_ _)m

  • cronで実行するプログラムにアクセス制限をかけたいです。

    cronで実行するプログラムにアクセス制限をかけたいです。 cron.phpをcronで3時間に1回実行しているのですが、誰かがこのcron.phpに直接アクセスしてきても同様のプログラムが実行されてしまいます。 これをcronからのみ実行できるように制限をかけたいのですが、どのようにするのが一般的なのでしょうか?.htaccessの基本認証等を使用するのですか? よろしくお願いしいます。

  • CRON でPHPを毎分実行するには?

    配布されておりましたPHPを、CRONで定期的に ●毎分実行したいのですが、どの様な記述をすればいいのでしょうか? ●PHPを、12時間毎に実行するには、どの様な記述をすればいいのでしょうか?

  • cronでPHP実行

    お世話になります。 OSはクライアントの為、恐縮ながら何を使用しているか不明となっております。 PHPバージョンは5.1.6です。 cronを使用して、毎日特定の時間に、メールを配信するPHPスクリプトを実行しようと試みているのですが、エラーメールが返ってきてしまいます。 因みに、URLを直接指定して実行した場合は正常にメールが配信されます。 設定方法は、crontab -e で 0 12 * * * /usr/lib/php -q /home/hoge/public_html/mail.php と記述しております。 返ってくるエラーメールの内容は、以下の通りです。 Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/home/hoge> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=hoge> X-Cron-Env: <USER=hoge> Message-Id: <xxxxxx@xxxxxxxxxx> Date: Sun, 28 Sep 2008 12:00:01 +0900 (JST) /bin/sh: /home/hoge/public_html/mail.php: Permission denied 以上、対策方法についてご存知の方がおられましたら、ご教授よろしくお願い致します。

  • CORESERVERでCRONジョブが実行されない

    この手の情報はネット上に沢山あるので自分なりに調べたのですが解決に至りませんでしたので質問させてください。 やりたいことは、CORESERVERのCRONジョブで設定した時間にcron.shを動かしてtest.phpを実行したいです。 ■現状 ・CRONジョブは毎日午前11時に動作するように設定 0 11 * * * ・CORESERVERからCRONジョブのエラーや成功メールが1通も届かない ・Tera Term で直接CRONを実行したが500エラーが返ってくる ・シェルスクリプトで動かしたいPHPファイルに問題はなかった(直接実行して成功) ■やったこと cron.shをCORESERVERのトップディレクトリに設置 /virtual/ユーザー名/cron.sh cron.shに記述した内容は #!/bin/sh #PHP /usr/local/bin/php /virtual/ユーザー名/public_html/サイトディレクトリ/php/test.php exit です。cron.shのパーミッションは705にしました。改行コードはLFです。 test.phpまでのディレクトリのパーミッションも705になっています。test.phpのパーミッションは644です。 Tera Term に入力したコマンド? sh /virtual/ユーザー名/cron.sh 上記を決定すると以下のスターテスが返ってきました。 Status: 500 Internal Server Error Content-type: text/html 何か根本的な間違いをしているのでしょうか? アドバイスをお願いいたします。

  • さくらVPSでcronでphpを実行

    さくらVPSでcronでphpを実行したいのですが、うまくいきません? vi /etc/crontab    ↓ 30 * * * * root /usr/bin/php/var/www/html/oms-main2/end.php 実行できないので /etc/rc.d/init.d/crond status → crond (pid 2559) を実行中 ちなみにend.phpは、手動では動きます。 宜しくご教授お願い致します。

  • さくらサーバーのcronでphpを動かしてファイルを作りたい。

    さくらサーバーのcronでphpを動かしてファイルを作りたい。 cron.php <?php $date = date("Y/m/d H:i:s"); $fp = fopen("./cron.txt", "w"); flock($fp, LOCK_EX); fputs($fp,$date); fclose($fp); print "cron成功"; ?> cron報告レポートには[cron成功]の文字が出ているので、cronコマンドは間違っていないのですが、cron.txtが作れていません。 直接、cron.phpにアクセスすると、[cron成功]と文字が出てcron.txtも作れています。 どうすればcron.txtが作れるのでしょうか。 よろしくお願いします。

  • Cronで同じ処理を複数同時に実行するには?

    PHPで作ったWebサービスがあります。 ユーザーが100人いたとします。 この100ユーザーそれぞれのデータを、毎日0時(例えば)になると処理をするというCronを作りたいです。 PHPファイルは1ユーザー分の処理をするので、Cronで毎日0時に指定すると1人分の処理しかできません。 ではユーザー毎にCronを100個作るのは得策ではないと思います。 「一つのCron実行で100人分処理すれば?」というご意見もあるかもしれませんが、 1人分の処理が3~30秒かかるので、レンタルサーバーの1実行当たりの動作時間を超えてしまう問題があります。 毎日0時に100人分の処理を実行するのは無理なのでしょうか? そもそも共用のレンタルサーバーレベルでは、100人分の同時処理というのは現実的ではないでしょうか? そうすると、1人ずつ処理していくと、30秒×100人=50分の処理時間が必要になります。 こういう場合はどのように設計すれば良いのでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • 期限時間内にファィル更新があったら作動するPHP

    期限時間内にファィルの更新があったら作動するPHPを作ってます。 5つのファィルをチェックし、「昨日から今までの間に5つのうちのひとつでもファィルの更新があったら」「hoge.cgi?&act=2」を実行するスクリプトです。 下記が完成形のつもりです。 テストをしたところ、5つのファィル全部が「一昨日以前の日にち」だと「PHPスクリプト終了!!」の文字が出ます。(計算通りです) 一方、5つのファィルのうち「1つでも昨日以降更新したファィル」があると「PHPスクリプト終了!!」の文字は出ません。これも計算通りです。 また、echo filemtime("../../../05/dannetsu/mail.cgi");の部分では、それぞれの時間が表示されます。(linux時間)これも計算通りです。 ただ、なぜか、http://hoge.jp/hoge.cgi?&act=2 の実行だけがされません。 if (filemtime.... の部分を「orで繋げず、1つのファィルを読みに行くだけで実行可否を判断」するようにするとhttp://hoge.jp/hoge.cgi?&act=2 は実行されます。 従い、orで繋げている部分のミスだと思うのですが、どう見直してもミスが見つかりません。 後は私の根本的な勘違いが潜んでいるのではないかと思い、相談する次第です。 宜しくお願い致します。。 ソース <?php date_default_timezone_set('Asia/Tokyo'); $script_tz = date_default_timezone_get(); if (strcmp($script_tz, ini_get('date.timezone'))){ echo 'Script timezone differs from ini-set timezone.'; } else { echo 'Script timezone and ini-set timezone match.'; } echo filemtime("../../../05/dannetsu/mail.cgi"); echo filemtime("../../../05/gaikou/mail.cgi"); echo filemtime("../../../05/gaisou/mail.cgi"); echo filemtime("../../../05/kiso/mail.cgi"); echo filemtime("../../../05/kutai/mail.cgi"); echo filemtime("../../../05/naisou/mail.cgi"); echo strtotime ("yesterday"); //日付をstrtotime()で変換して比較します if (filemtime("../../../05/dannetsu/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/gaikou/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/gaisou/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/kiso/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/kutai/mail.cgi") > strtotime ("yesterday") or filemtime("../../../05/naisou/mail.cgi") > strtotime ("yesterday")) { $buf = file_get_contents('http://hoge.jp/ho/ge/ho/hoge.cgi?&act=2'); echo $buf; }else{ exit( "PHPスクリプト終了!!" ); } ?>

    • ベストアンサー
    • PHP
TS8430カセットエラー
このQ&Aのポイント
  • TS8430カセットエラーが発生し、カセットが開いたまま進めない状態です。カセットを閉めても解決しないため、故障の可能性があります。
  • TS8430カセットエラーが表示され、カセットを入れ直しても問題が解消されません。さらに、電源の再起動を試みてもエラーが表示されます。故障が考えられます。
  • TS8430カセットエラーが発生し、カセットを閉じても問題が解決されず、電源のオン/オフを試してもエラーが表示されます。故障の可能性が高いです。
回答を見る