• ベストアンサー

phpで web-page と cron job 記述の違い教えてください

 phpのhttp内記述と XREAのCRON内記述の違いについてこのPGに関して教えてください。  現在防犯カメラとして動作感知すればサーバーに写真画像UPするようにしてます。  しかし、旧写真をFTPで手動で削除しており手間が大変です。よってCRON-JOB化したく勉強中です。  カメラの仕様でファイル名に日付+時間が着くのでまずファイル名を取得して。 次に削除ロジックを組み込みたいと取り掛かりました。が  指定時間にJOBは稼動するのですが、エラーが出て基本的文法の勉強不足の為原因が判りません。間違いを指摘ください。  下記は正常に稼動する http://aa.ebb.jp/ 内にある~.jpgを抜き出すPGです。 <HTML> <?php echo "** 動作 開始**`date '+%Y/%m/%d %H:%M'`."; if (!($dir = opendir("./"))) { die; } while ($fnm = readdir($dir)) { if (ereg('.jpg$', $fnm)) { print "<P>$fnm</P>\n"; } } closedir($dir); を下のアドレスへUPし実行しますと正常に動作します。(日時は実行無し) http://aa.ebb.jp/t4.php ★★★★実行結果:★★★★日時表示しない以外は正しく稼動してます ** 動作 開始**`date '+%Y/%m/%d %H:%M'`. shasin01.jpg shasin02.jpg shasin03.jpg shasin04.jpg shasin05.jpg ** 動作 終了**`date '+%Y/%m/%d %H:%M'`.  これをCRON JOB化したく次のコーディングしてUPとcronジョブ欄にSETしました。 (写真データともに上記WEBページと同じ場所http://aa.ebb.jp内) #!/bin/sh #PHP /usr/local/bin/php /virtual/aaa/public_html/aa.ebb.jp echo "** 動作 開始**`date '+%Y/%m/%d %H:%M'`."; if (!($dir = opendir("./"))) { die; } while ($fnm = readdir($dir)) { if (ereg('.jpg$', $fnm)) { print "<P>$fnm</P>\n"; } } closedir($dir); exit 格納場所は下記場所です。LFやコードは注意してるつもりですが? public_html/aa.ebb.jp/ct4.sh  実行時次のエラーが帰ってきます。(echo内容の日時は正しく表示) 他でも( のところで引っかかってPG実行出来ません。 ★★★★実行結果:★★★★管理者宛メール内容 ** 動作 開始**2008/01/25 17:15. /virtual/aaa/public_html/aa.ebb.jp/ct4.sh: line 5: syntax error near unexpected token `(' /virtual/aaa/public_html/aa.ebb.jp/ct4.sh: line 5: ` if (!($dir = opendir("./"))) {'

  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

XREAでcronを書くときには 【ct4.sh】 #!/bin/sh #PHP /usr/local/bin/php /virtual/aaa/public_html/aa.ebb.jp/t4.php とだけ書いておけば、指定した時刻にt4.phpを実行します。/usr/local/bin/php の引数はスクリプトを記述したファイルです。c4.shの中にphpスクリプトを書いてはいけません。

参考URL:
http://sb.xrea.com/showthread.php?t=12181
oldjupiter
質問者

お礼

 早速ご指示通りやって成功しました。  大変早い回答に感謝します。  実はshimixさんの過去回答を参考にやったのですが、どこか間違ってたのですね。  次の課題は print コマンドを rm か unlink コマンドに変えて実際に削除できるよう、変更する必要があります。今のところ、phpでもcronでもファイル名直書きでは出来ましたが、組み込み繰り返しは成功していません。 不思議ですが実験で下記の場合はshの中に直下記してもファイルは削除されています。 略 rm /virtual/aaa/public_html/sakujyo.php 略 本件実行結果です。10日位悩んだのが数分で・・。本当にありがとうございました。 Content-type: text/html <HTML> ** 動作 開始**`date '+%Y/%m/%d %H:%M'`.<P>shasin01.jpg</P> <P>shasin02.jpg</P> <P>shasin03.jpg</P> <P>shasin04.jpg</P> <P>shasin05.jpg</P>

その他の回答 (1)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

防犯カメラの画像を手動で削除しないでどうやって防犯するんだろうという突っ込みはさておき。 shにphpのコードを書いても動くはずがありません。 shにはshの文法が、phpにはphpの文法があります。 aa.ebb.jpの最後に echo "** 動作 開始**`date '+%Y/%m/%d %H:%M'`."; (snip) を記述するか、PHPロジックを別ファイルに記述しshの中で /usr/local/bin/php /virtual/aaa/public_html/aa.ebb.jp /usr/local/bin/php /virtual/aaa/public_html/作ったPHPファイル としましょう。

oldjupiter
質問者

補足

 早速の回答ありがとうございます。 おかげさまで、別々に書いて解決いたしました。もう一つの方テストしましたが?(snip)の意味からshの終わりで次から実行内容と解釈して、ご指示のところへ記入しましたが。以下添付のようなエラーとなりました。しかし本件は解決しました。お時間をいただき本当にありがとうございます。  蛇足ですが、突っ込まれた件の回答は、曜日別に別リレクトリにUPしておりますので。cronの実行を曜日別に設定します。3日も保存してれば充分ですので。PG力がつけばwrite日が数日古いものを毎日消すようにしたいと考えています。 ** 動作 開始**2008/01/25 21:00. /virtual/aaa/public_html/aa.ebb.jp/ct4.sh: line 4: snip: command not found /virtual/aaa/public_html/aa.ebb.jp/ct4.sh: line 5: syntax error near unexpected token `(' /virtual/aaa/public_html/aa.ebb.jp/ct4.sh: line 5: ` if (!($dir = opendir("./"))) {'

関連するQ&A

  • phpからサーバー上のcronにジョブ登録したい

    プログラミング初心者です。 【ウェブブラウザでphpファイルを開くと、レンタルサーバーのcronにジョブ登録される】ようにしたいのですが、上手く行きません。 下記記述に不備はありますでしょうか? <?php $cron = popen("/usr/bin/crontab -", "w"); $line = "51 22 13 11 * /usr/bin/php /home/userid/public_html/絶対パスでファイルの場所/ファイル.php"; fwrite($cron, $line); pclose($cron); ?> ※テストとして 11/13 22:51 に実行するような記述をしていました。 諸々検索もしたのですが、レンタルサーバー上にphpでジョブ登録するような事例がなく… お力添えください。宜しくお願い致します。

    • 締切済み
    • PHP
  • 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 何か根本的な間違いをしているのでしょうか? アドバイスをお願いいたします。

  • wordpress内でphpをcronで叩きたい

    wordpressを運用しています。 wordpressのディレクトリ内(テーマファイル内)に置いたphpをcronで叩きたいのですが、うまくいきません。 そのphpは普通にブラウザでアクセスすれば実行されます。 なぜか考えてみたのですが、wordpress内ではcronが叩けない(cronでアクセス出来ない?)、もしくはphpの中でwordpress独自のグローバル変数「$wpdb」を用いているからだと思います。 $wpdbは下記URLのようなものです。 http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class おそらくwordpressのディレクトリ内ではcronが叩けない、という理由なのだと思いますが、php内では$wpdbというグローバル変数を用いたいため、wordpressのディレクトリ外で実行もできない状況です。 私のwordpressやcronの認識が甘いので、考えていることが見当はずれかもしれません。 結局$wpdbというグローバル変数を用いたphpを定期実行したいのですが、どうすればいいでしょうか?

  • PHPからcronを編集したい

    ブラウザから時間を指定してリクエストを投げると下記PHPを実行するプログラムがあります。 shell_exec("echo {$pass} | sudo -S sh -c 'cat {$root_dir}/craw/crontab.txt > /var/spool/cron/crontabs/{$cron_user}'"); shell_exec("echo {$pass} | sudo -S chown {$cron_user}:crontab /var/spool/cron/crontabs/{$cron_user}"); shell_exec("echo {$pass} | sudo -S chmod 600 /var/spool/cron/crontabs/{$cron_user}"); 実行はちゃんと行われて、/var/spool/cron/crontabs/userの中身もちゃんと期待したとおりに変更されています。 しかし、いくら待っても登録したjobが実行されることはありません。(/var/log/syslogを見ても実行された形跡はありません) shell_exec("echo {$cron_pass} | sudo service cron restart"); を付け加えてみても結果は同じでした。 crontab -eで編集→保存とするとちゃんと反映されるようです。 どのようにすればPHPからcronを登録できるでしょうか。 よろしくお願い致します。

  • cronに変わるジョブ管理ツール

    cronより高機能で、代替品になるジョブ管理ツールは無いでしょうか。 欲しい機能としては - ジョブの実行を、cronのような時間指定だけでなく、登録された別のジョブが成功/失敗したら実行、という条件で行える - 設定がCUIから行える(設定ファイルを手で編集するか、CUIの設定ツールで行う) - オープンソースで、なおかつフリーで導入できる というあたりです。 イメージとしては、JP1ほど高機能でなくてもいいしサポートも要らないけど、cronよりは機能が欲しい、という感じです。

  • PHP+CRONでのファイルバックアップ

    お知恵をお貸しください。 PHP全くの初心者です。。。 PHPスクリプトとCRONで、定期的にWebサーバー内の複数ファイル(異なるdirにあるファイル)をバックアップ用に作成したdirにバックアップ、同時に世代管理をしたいと考えています。 検索したところ、目的に近い以下のスクリプト情報が見つかりました。 見つかったスクリプトのフローは、 ・単純にファイルをコピーし、バックアップ先のdirへバックアップ、スクリプトの実行日を付加した名前へリネームして保存 ・一定時間(例は20日以上としてます)経過した古いファイルを削除 という流れです。 このスクリプトを利用し、 バックアップファイルに関する設定部分(対象、保存先、経過時間)を分かり易く、また複数設定できるようにしたいと思っています。 動作環境は一般的なレンタルサーバー(さくらインターネットやXsever)でPHPのバージョンは、「PHP5.6.30」、「PHP7.0.16」、「PHP7.1.2」の3つのVerです。 ※CRONでの実行は定刻に1日1回の予定です。 ※バックアップ先となるdirは(操作権限を持つ同一アカウントの)レンタルサーバー(同じサーバー内)のdirです。 ↓↓↓参考スクリプト↓↓↓ 1)単純にファイルをコピー、リネームして保存 $dirHome = '/home/hogehoge/domain.com/public_html/csv/'; $date = date('Ymd'); if(copy($dirHome . 'test.csv', $dirHome .'backup/test.csv')){ echo 'test.csvをコピーしました。'; rename($dirHome . 'backup/test.csv', $dirHome .'backup/test'.$date.'.csv'); echo 'test.csvをリネームしました。'; } else { echo 'test.csvをコピーできません!'; } 2)一定時間(20日以上)経過した古いファイルを削除 date_default_timezone_set('Asia/Tokyo'); $expire = strtotime("480 hours ago"); //20日前 $dir = dirname(__FILE__) . '/backup/'; $list = scandir($dir); foreach($list as $value){ $file = $dir . $value; if(!is_file($file)) continue; $mod = filemtime( $file ); if($mod < $expire){ chmod($file, 0777); unlink($file); } } 3)複数設定する場合に記述する設定内容例 ※以下のようにバックアップ対象(target)、バックアップ先dir(bk_dir)、削除対象となる経過時間(expire)を、それぞれに設定するようにしたいと思っています。 $list = []; // 設定を格納する配列 // 設定1 $list[] = [ 'target' => 'domain1.com/public_html/news/data.dat', 'bk_dir' => 'domain1.com/public_html/backup/news/', 'expire' => 480 ]; // 設定2 $list[] = [ 'target' => 'domain2.com/public_html/news/data.dat', 'bk_dir' => 'domain2.com/public_html/backup/news/', 'expire' => 480 ]; ※以下、必要な分だけ記述する。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 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 以上、対策方法についてご存知の方がおられましたら、ご教授よろしくお願い致します。

  • 条件によりそれ以下を実行しない方法

    あるディレクトリ(./ppp)をオープンして、ディレクトリ内の最新ファイル名を取得し、その最新ファイル名(下記スクリプト中の$filename)に".gz"という文字列が含まれていたらそれ以下のスクリプトを実行せずにディレクトリクローズしてスクリプトを中止するスクリプトを考えています。下記スクリプト中の■■■の部分にあたる部分がわかりませんのでご教授願います。phpは4.3.2です。 =========== <?php $dir = opendir("./ppp");//ディレクトリオープン $latestfile = 0;//最新ファイル名取得 while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./ppp/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./ppp/$latestfilename"; } } ■■■ ・ ・ ・ closedir($dir); ?> ===========

    • ベストアンサー
    • PHP
  • ディレクトリ内の最新ファイルのみをコピーが上手くいかない

    下記のようなスクリプトにより、 ./ディレクトリ内の更新日付が最新のファイル名を取得し、 そのファイルを./bbbディレクトリにコピーするということを行いたいのですが、 更新日付が最新のものに関わらず全てのファイルがコピーされてしまいます。 <?PHP $dir = opendir("./"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $to="./bbb/".$fnm; if(!file_exists($to)) copy("./".$fnm,$to); } } closedir($dir); ?> 自力ではどこがヘンなのか理解できないため、どなたか教えてください。

    • ベストアンサー
    • PHP
  • filemtimeについて

    filemtime関数を使ってあるディレクトリ(./aaa)の中の最新のファイルを表示させようとしていますが、少し前までは上手くいっていたのですが、急に予定通りに動かなくなってしまい、ちょっと自分では解決できないため質問させていただきます。 スクリプトは下記になります。 <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; clearstatcache(); $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; $filename = "./aaa/$latestfilename"; echo "$filename"; } } closedir($dir); ?> これで実行すると、aaaディレクトリ内のファイル名が全て表示されてしまいます。※ファイルの更新日時はファイルごとに異なっています。 どなたかご教授願います。

    • ベストアンサー
    • PHP