PHP_PHP チュートリアルでの crontab コード共有の実装

WBOY
リリース: 2016-07-13 10:00:21
オリジナル
971 人が閲覧しました

PHP での crontab コード共有の実装

この記事では、PHP での crontab コード共有の実装を主に紹介します。この記事では、実装コードと使用方法を説明します。

1. 標準の crontab ファイルを準備します

コードは次のとおりです:

#mhドムモンダウコマンド
* * * * * 日付 > /tmp/cron.date.run

2. crontab -e は、この cron.php スクリプトをシステム cron に追加します

コードは次のとおりです:

* * * * * /usr/bin/php cron.php

3. cron.php ソースコード

コードは次のとおりです:

// ./crontab または他の永続ストレージ (mysql、redis) から cron アイテムを読み取ります
$crontab = file('./crontab');
$now = $_SERVER['REQUEST_TIME'];

foreach ( $crontab として $cron ) {

$slices = preg_split("/[s]+/", $cron, 6);
if( count($slices) !== 6 ) 続行;

$cmd = array_pop($slices);

$cron_time = implode(' ', $slices);
$next_time = Crontab::parse($cron_time, $now);
if ( $next_time !== $now ) 続行;

$pid = pcntl_fork();

if ($pid == -1) {
die('フォークできませんでした');
else if ($pid) {
// 私たちは親です
pcntl_wait($status, WNOHANG) //子供たちをゾンビから守る
} その他 {
// 私たちは子供です
`$cmd`;
終了します;
}
}

/* https://github.com/jkonieczny/PHP-Crontab */

クラス Crontab {
/**
* crontab 構文の次回実行時間 (スタンプ) を検索します
* 指定された開始タイムスタンプの後 (省略された場合は現在時刻)
*
* @パラメータ文字列 $_cron_string:
*
* 0 1 2 3 4
* * * * * *
* - - - - -
* | | | | |
* | | | | +----- 曜日 (0 - 6) (日曜日=0)
* | | | +---------- 月 (1 - 12)
* | | +----------- 毎月の日 (1 - 31)
* | +----------- 時間 (0 - 23)
* +--------------- 分 (0 - 59)
* @param int $_after_timestamp タイムスタンプ [デフォルト=現在のタイムスタンプ]
* @return int unix タイムスタンプ - 次回の実行時間は長くなります
* 指定されたタイムスタンプより (デフォルトは現在のタイムスタンプ)
* @throws InvalidArgumentException
*/
パブリック静的関数 parse($_cron_string,$_after_timestamp=null)
{
if(!preg_match('/^((*(/[0-9]+)?)|[0-9-,/]+)s+((*(/[0-9]+)?)|[ 0-9-,/]+)s+((*(/[0-9]+)?)|[0-9-,/]+)s+((*(/[0-9]+)?) |[0-9-,/]+)s+((*(/[0-9]+)?)|[0-9-,/]+)$/i',trim($_cron_string))){
throw new InvalidArgumentException("無効な cron 文字列: ".$_cron_string);
}
if($_after_timestamp && !is_numeric($_after_timestamp)){
throw new InvalidArgumentException("$_after_timestamp は有効な UNIX タイムスタンプである必要があります ($_after_timestamp が指定されています)");
}
$cron = preg_split("/[s]+/i",trim($_cron_string));
$start = empty($_after_timestamp)?time():$_after_timestamp;

$date = array( '分' =>self::_parseCronNumbers($cron[0],0,59),

'時間' =>self::_parseCronNumbers($cron[1],0,23),
'dom' =>self::_parseCronNumbers($cron[2],1,31),
'月' =>self::_parseCronNumbers($cron[3],1,12),
'dow' =>self::_parseCronNumbers($cron[4],0,6),
);
// time()+366 に限定 - 1 年以上先を確認する必要はありません
for($i=0;$i if( in_array(intval(date('j',$start+$i)),$date['dom']) &&
in_array(intval(date('n',$start+$i)),$date['month']) &&
in_array(intval(date('w',$start+$i)),$date['dow']) &&
in_array(intval(date('G',$start+$i)),$date['hours']) &&
in_array(intval(date('i',$start+$i)),$date['分'])

){

$start+$i を返す;
}
}
null を返す;
}

/**

* 単一の cron スタイル表記を取得し、それを数値に解析します
*
* @param string $s cron 文字列要素
* @param int $min 可能な最小値
* @param int $max 可能な最大値
* @return int 解析された数値
*/
保護された静的関数 _parseCronNumbers($s,$min,$max)
{
$result = array();

$v = 爆発(',',$s);

foreach($v として $vv){
$vvv = 爆発('/',$vv);
$step = empty($vvv[1])?1:$vvv[1];
$vvvv = 爆発('-',$vvv[0]);
$_min = count($vvvv)==2?$vvvv[0]:($vvv[0]=='*'?$min:$vvv[0]);
$_max = count($vvvv)==2?$vvvv[1]:($vvv[0]=='*'?$max:$vvv[0]);

for($i=$_min;$i $result[$i]=intval($i);
}
}
ksort($result);
$result を返します;
}
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/974521.html技術記事 PHP での crontab コード共有の実装 この記事では、主に PHP での crontab コード共有の実装を紹介します。必要な友達は、次を参照してください。 1. マークを準備します...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート