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

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

ただいまの
回答率

89.25%

PHPからcronの設定

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 8,212

Yamer

score 13

初めまして。

linuxなどを一切使わずPHPからのみの操作でクローンの設定をしたくて色々と試しましたが、そのやり方が分かりませんので、ご教授頂きたいです。

設定したいクローンの中身は、DBのflag(カラム名です)が、0、のモノを1分毎に削除する、という命令になります。

以下に当然のことながら動作はしませんが、一応私の考えた、設計の手順と、その手順を下に実際に書いたコードを記載いたします。

ご参考になれば幸いです。


以下が、設計の手順となります。

1, flag(カラム名です)が『0』のデータをDBから削除する、という命令を記述したPHPファイルの作成
2, cronの中身を書いたテキストファイルの作成
3, テキストファイルに書いたcronの中身を、system関数を用いて、設定する


以下が、上記の設計の手順を下に実際に書いたコードとなります。
(共通設定ファイルの記述は省略しています。)


●1, flag(カラム名です)が『0』のデータをDBから削除する、という命令を記述したPHPファイルの作成

・ファイル名・・・toroku_delete.php

・ファイルの中身↓

<?php

$toroku_delete = "DELETE FROM members WHERE flag=0";

mysql_query($toroku_delete);

?>


●2, cronの中身を書いたテキストファイルの作成

・ファイル名・・・cron_content.txt

・ファイルの中身↓

*/1 * * * * /toroku_delete.php


●3, テキストファイルに書いたcronの中身を、system関数を用いて、設定する

・ファイル名・・・cron.php

・ファイルの中身↓

<?php

$command = "crontab /cron_content.txt";

system($command);

?>


お手数ですが、何卒よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

>たぶんクーロンに設定が全くされてないよ
>とのアドバイスを頂きましたが、どうゆう意味なのか分かりませんでした。

おそらくcronにジョブ(1分毎にtoroku_delete.phpを実行する仕事)が登録されてないか、環境変数が読まれてないということか、そもそもcronを実行するプログラム(crond)が動作してないということをおっしゃっているのだと思います。

cronを実行するプログラム(crond)が動作しているか確認してみていただけますか。
下のコマンドをroot権限で実行してください。実行中と出力されていれば、動作しています。

# /etc/rc.d/init.d/crond status

crondが動作しているならば、cron.phpを実行した後に、以下のコマンドを実行すると、cronにジョブが登録されている事が確認できるのですが、登録されているか確認していただけますか。
$ crontab -l

登録されていたら、以下のコマンドで、phpがインストールされているパスを調べてみましょう。
$ which php

そして、以下のコマンドを実行して、cronからtoroku_delete.phpが起動できるか、確認してみましょう。
直接crontabを書き換えます。そして実行結果(エラーも含めて)をファイルに書き起こしてみます。
$ crontab -e
*/1 * * * * /usr/bin/php(※phpがインストールされているパス) /toroku_delete.php > /hoge.txt 2>&1

これで、実行されるのを待ちます。実行されたら、/hoge.txtになんらかの文字が出力されていますでしょうか。

>/usr/bin/php
>/usr/local/bin/php
>これらを付ける意味を全く分かっておりません。

これは、phpというプログラムのパスを指定しています。
なぜそんなことするかというと、cronで実行すると、環境変数が設定されないので、OSから見ると、phpというプログラムが見つけられない場合があるからです。(これは、ありがちなミスです)
ですので、絶対パスで指定する必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/20 16:43

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

    申し上げて頂きました通り、

    $command = "crontab フルパス/cron_content.txt";

    以上で、cron_content.txtの最後を改行すると、


    成功


    と出て、ジョブを登録出来ました。

    ただ、なぜかcron_content.txtの中身が、重複して登録されてしまいます。

    本来であれば、

    */1 * * * * /usr/local/bin/php /toroku_delete.php

    となって欲しいのですが、

    */1 * * * * /usr/local/bin/php /toroku_delete.php */1 * * * * /usr/local/bin/php /toroku_delete.php

    以上のように一つ多く登録されてしまいます。

    ジョブも実行されることはありません。

    改行コードは、od -cコマンドを使って確認したところ、

    0000000 * / 1 * * * * / u s r 0000020 / l o c a l / b i n / p h p / 0000040 t o r o k u _ d e l e t e . p h 0000060 p \n 0000062 0000062

    以上のように出てきまして、改行コードがLFである目印である、【\n】があるので、LFであると思われます。

    残る問題点としては、

    ・ジョブが重複されて登録されてしまうこと
    ・登録されたジョブが実行されないこと

    の2点のような気がします。

    大変お手数をおかけしますが、もし可能であれば、引き続き問題の解決にお力添え頂けますと幸いです。

    何卒よろしくお願いいたします。

    キャンセル

  • 2015/01/20 17:46

    >・ジョブが重複されて登録されてしまうこと
    これは明確にはわかりませんが、crontab -lの出力結果をechoなどで、2重に出力しているとか、cron_content.txtの記述に立て続けに2個書いてるなど、ミスしているだけだと思います。

    >・登録されたジョブが実行されないこと
    */1 * * * * /usr/local/bin/php (フルパス)/toroku_delete.php
    として見てください。

    キャンセル

  • 2015/01/20 20:58

    ご返信ありがとうございます。

    おかげさまで、クーロンの設定を完了させることが出来ました。

    ご指摘頂いた通り、パスが原因でした。

    重複に関してもご指摘頂いた通りで、echoが原因でした。

    このたびは、本当に最後までご親切に対応してくださりありがとうございました。

    また機会がございましたら何卒よろしくお願いいたします。

    ありがとうございました。

    キャンセル

0

個人的にはcronファイルやcronの内容である実行phpファイルのパスの問題である気がしています。
system関数の箇所を以下に書き換えて、エラー出力または標準出力内容を出力できますでしょうか。
$output = $retval = null;
exec($command, $output, $retval);
if ($retval != "0") {
 echo implode($output, "\n");
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/18 18:50

    ご丁寧に回答頂きありがとうございます。

    申し上げて頂いた通りに書き換えたところ、何も表示されず真っ白な画面となりました。

    toroku_delete.phpに関しては正常に動作しておりますので、やはり、cronの中身を書いたテキストファイルの作成に問題があるのでしょうか?

    */1 * * * * /toroku_delete.php

    だけでなく、

    以下なども試しましたがダメでした。

    --

    */1 * * * * /usr/bin/php /toroku_delete.php

    --

    */1 * * * * /usr/bin/php /toroku_delete.php

    --

    */1 * * * * /usr/local/bin/php /toroku_delete.php

    --

    $ crontab -e
    */1 * * * * /toroku_delete.php

    --

    $ crontab -e
    */1 * * * * /usr/bin/php /toroku_delete.php

    --

    $ crontab -e
    */1 * * * * /usr/local/bin/php /toroku_delete.php

    --

    そもそも、ファイルパスの前に

    /usr/bin/php

    /usr/local/bin/php

    これらを付ける意味を全く分かっておりません。

    他の場所では、

    たぶんクーロンに設定が全くされてないよ、

    とのアドバイスを頂きましたが、どうゆう意味なのか分かりませんでした。

    大変お手数おかけして申し訳ございませんが、もし可能であれば、再度問題点等をご指摘して頂けますと幸いです。

    何卒よろしくお願いいたします。

    キャンセル

0

パスの意味もわからないとなるとこのレベルから疑ってしまいますが、
$command = "crontab /cron_content.txt"; 
ですが、/ の直下にちゃんと ファイルはあるのでしょうか?
「フルパス」という言葉の意味はわかりますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/19 23:45

    ご丁寧に回答頂きありがとうございます。

    そのように肝に銘じます。

    ありがとうございます。

    キャンセル

  • 2015/01/20 07:53

    すいません。さきほどのコメントは、
    「crontabの後はどんな場合であれフルパスで書く」
    の間違いです。注意しておきながら自分で書き間違えるとは。

    あと、 /toroku_delete.php も / の直下にありますか?
    ファイルのフルパスと、URLの絶対パスを混同しているように思えます。
    コマンドラインでは、常にフルパスを使ってください。

    キャンセル

  • 2015/01/20 12:58

    ご丁寧にご回答頂きありがとうございます。

    「crontabの後はどんな場合であれフルパスで書く」

    と肝に銘じます。

    /toroku_delete.phpは、URLの絶対パスという意味です。

    こちらもフルパスなんですね。

    では、テキストファイルの中身も

    */1 * * * * /usr/local/bin/php /toroku_delete.php

    以上ではなく、

    */1 * * * * /usr/local/bin/php フルパス

    に書き直します。

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.25%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる