PHPを使用してcronジョブを作成する方法


100

私はcronジョブを初めて使用します。書き方すらわかりません。インターネットから検索してみましたが、よくわかりません。毎分コードを実行するcronジョブを作成したいと思います。PHPを使用して作成しています。動作していません。

run.php (毎分実行されるコード)

<?php

echo "This code will run every minute";

?>

cron.php

<?php

$path = dirname(__FILE__);
$cron = $path . "/run.php";
echo exec("***** php -q ".$cron." &> /dev/null");

?>

これら2つのファイルが同じフォルダーにあるとします。

私がしたコードは間違っていますか?間違っている場合は、修正方法を教えてください。


サーバーでシェルにアクセスできますか?

8
***をエコーアウトして、cronジョブが作成されることを期待することはできません。cronjobsを作成する方法をここで読んでください(Linuxを実行しているサーバーを使用している場合)thesitewizard.com/general/set-cron-job.shtml
tlenss

@Dagon:私はこれについて知りません。確かめます。
user2738520 2013

これは1回限りのイベントなので、使用してくださいcrontab
Ed Heal

回答:


66

これは、私がこれまでに見つけたPHPのコードに関する最良の説明です。

http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

要するに:

新しいジョブをスケジュールする構文は、一見すると気の遠くなるように見えるかもしれませんが、実際に分解すると、理解するのは比較的簡単です。cronジョブには常に5つの列があり、それぞれが年代順の「演算子」を表し、その後にフルパスと実行するコマンドが続きます。

* * * * * home / path / to / command / the_command.sh

時系列の各列は、タスクのスケジュールに特定の関連性があります。それらは次のとおりです。

Minutes represents the minutes of a given hour, 0-59 respectively.
Hours represents the hours of a given day, 0-23 respectively.
Days represents the days of a given month, 1-31 respectively.
Months represents the months of a given year, 1-12 respectively.
Day of the Week represents the day of the week, Sunday through Saturday, numerically, as 0-6 respectively.

ここに画像の説明を入力してください

したがって、たとえば、毎月1日の午前12時にタスクをスケジュールする場合は、次のようになります。

0 0 1 * * home / path / to / command / the_command.sh

タスクを毎週土曜日の午前8時30分に実行するようにスケジュールする場合は、次のように記述します。

30 8 * * 6 home / path / to / command / the_command.sh

スケジュールをさらにカスタマイズするために使用できる演算子もいくつかあります。

Commas is used to create a comma separated list of values for any of the cron columns.
Dashes is used to specify a range of values.
Asterisksis used to specify 'all' or 'every' value

完全な記事のリンクにアクセスしてください、それは説明します:

  1. 手動で入力/編集する場合のcronjobの形式は何ですか。
  2. SSH2ライブラリーでPHPを使用して、ユーザーとして認証する方法(どのcrontabを編集するか)。
  3. 認証、crontabエントリの編集および削除に必要なすべてのメソッドを備えた完全なPHPクラス。

34

cron.phpを実行しようとしているのと同じ方法で、別のPHPスクリプトを実行できます。ただし、CLIインターフェースを介して行う必要があります。

#!/usr/bin/env php
<?php
# This file would be say, '/usr/local/bin/run.php'
// code
echo "this was run from CRON";

次に、エントリをcrontabに追加します。

* * * * * /usr/bin/php -f /usr/local/bin/run.php &> /dev/null

run.phpスクリプトに実行権限がある場合、/ usr / bin / php部分なしで、crontabに直接リストすることができます。スクリプトの「env php」部分は、実際にPHPコードを実行するための適切なプログラムを見つけます。したがって、「実行可能」バージョンの場合-ファイルに実行権限を追加します。

chmod +x /usr/local/bin/run.php

次に、次のエントリをcrontabに追加します。

* * * * * /usr/local/bin/run.php &> /dev/null

11

Alisterに追加され、サーバーのsshセッションでcrontab -eと入力することで、通常(常にそうとは限りません)crontabを編集できます。

星は以下を表します(*はこの単位のすべてを意味します):

[Minute] [Hour] [Day] [Month] [Day of week (0 =sunday to 6 =saturday)] [Command]

これについては、こちらでさらに読むことができます


2

linux / ubuntuターミナルに次のように入力します

 crontab -e 

エディターを選択し(場合によってはエディターを要求する)、これを毎分実行する

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null

1

あなた自身のコンテンツをホストしていない場合、それはあなたのウェブホストに依存するかもしれません。Webホストが同期ジョブの作成をサポートしている場合は、頻度を選択し、実行するファイルへの絶対パスを入力するためのフォームに記入する必要がある場合があります。たとえば、私のWebホスト(DreamHost)では、ファイルへの絶対パスを入力し、選択メニューから頻度を選択することで、カスタムcronジョブを作成できます。サーバーではこれができない場合があります。その場合は、直接またはホスト固有の方法でcrontabを編集する必要があります。

上記のAlister Bulmanの詳細と同様に、CLIを使用して実行するPHPファイルを作成します(#!/usr/bin/env phpファイルの先頭の<?phpタグの前に必ず含めてください。これにより、スクリプトの実行時に呼び出される実行可能ファイルをシェルが認識できるようになります。


0

なぜカールを使わないのですか?論理的には、phpファイルを実行すると、ブラウザでurlを実行します。あなたがカールを実行する場合、それは非常に簡単です

while(true)
{
    sleep(60); // sleep for 60 sec = 1 minute

    $s = curl_init();
    curl_setopt($s,CURLOPT_URL, $your_php_url_to_cron); 
    curl_exec($s); 
    curl_getinfo($s,CURLINFO_HTTP_CODE); 
    curl_close($s);
}

5
これは理論的には機能しますが、php-scriptは常に実行する必要がありますが、これは良いことではありません。
bestprogrammerintheworld 2018年

1
これを永久に実行するには、php-max-execution-timeを0に設定する必要があります。また、スクリプトでエラーが発生した場合、手動で再起動するまでスクリプトは再度実行されません。
Hassan Raza 2018年

0

$command = "php ".CRON_PATH.php ";
if(substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $command, "r"));
}else{
shell_exec($command ." > /dev/null &");
}


6
私はあなたのコードにとても興味がありますが、説明できますか?
プレシャストム

0

まず、ユーザー名とパスワードでSSHサーバーを開き、デフォルトのrootユーザー(すべての権限を持つユーザー)に変更してから、以下の手順に従います。

  1. ここでコマンドを入力すると、crontab -lすべてのcronジョブのリストが表示されます。
  2. crontab -eすべてのcronジョブが開かれるファイルを入力します。
  3. cronjobスケジュールを使用してファイルを編集し、ファイルをmin hr dayofmonth month dayofweek pathtocronjobfile保存します。
  4. これで応答crontab: installing new crontabが表示されます。ここで、cronジョブが一覧表示されるcronジョブのリストを再度確認します。

0

より良いプロジェクトを使用クロンを、このタスクのためのLinuxのcronジョブとの組み合わせで。PHPコードでランタイムを構成し、バックグラウンドジョブをサポートし、簡単に使用できます。

最初のステップは、毎分PHPスクリプトを呼び出します。

* * * * * /usr/local/bin/run.php &> /dev/null

2番目のステップでは、cron / cronパッケージを使用して、ランタイムをPHPで直接構成します。

$deprecatedStatus = new ShellJob();
$deprecatedStatus->setCommand('cd /app && /usr/local/bin/php cron/updateDeprecatedStatus.php');
$deprecatedStatus->setSchedule(new CrontabSchedule('* * * * */2'));


$displayDate = new ShellJob();
$displayDate->setCommand('cd /app && /usr/local/bin/php cron/updateDisplayDate.php');
$displayDate->setSchedule(new CrontabSchedule('* * * * */5'));

リンクされたリポジトリで使用方法の詳細を見つけました。


-1

このようなcronjobを作成して毎分作業する

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null

4
端末やcpanelを使用せずに、phpを使用してcronjobを作成するためのソリューションを探していると思います。また、phpのみを使用してこの解決策を見つけたいと思っています。
user3264863

-1

これを解決する簡単な方法があります。1分ごとにcronでphpファイルを実行し、php実行可能ファイル内で、「今」という時間に実行する「if」ステートメントを次のように作成できます。

<?/** suppose we have 1 hour and 1 minute inteval 01:01 */

$interval_source = "01:01";
$time_now = strtotime( "now" ) / 60;
$interval = substr($interval_source,0,2) * 60 + substr($interval_source,3,2);


if( $time_now % $interval == 0){
/** do cronjob */
}

4
これはページをロードした場合にのみ機能します。基本的にこれは解決策ではありません!
MD。Atiqur Ra​​hman 2017

ブラウザを閉じたらどうなりますか?これは失敗します!
Resheil Agarwal

-2
function _cron_exe($schedules) {
        if ($obj->get_option('cronenabledisable') == "yes") {
            // $interval = 1*20;
            $interval = $obj->get_option('cronhowtime');
            if ($obj->get_option('crontiming') == 'minutes') {
                $interval = $interval * 60;
            } else if ($obj->get_option('crontiming') == 'hours') {
                $interval = $interval * 3600;
            } else if ($obj->get_option('crontiming') == 'days') {
                $interval = $interval * 86400;
            }
            $schedules['hourlys'] = array(
                'interval' => $interval,
                'display' => 'cronjob'
            );
            return $schedules;
        }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.