PHP中如何實現crontab代碼
PHP是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。下面,小編為大家搜索整理了PHP中如何實現crontab代碼,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!
1. 準備一個標準crontab文件 ./crontab
代碼如下:
# m h dom mon dow command
* * * * * date > /tmp/
2. crontab -e 將此腳本加入系統cron
代碼如下:
* * * * * /usr/bin/php
3. 源碼
代碼如下:
// 從./crontab讀取cron項,也可以從其他持久存儲(mysql、redis)讀取
$crontab = file('./crontab');
$now = $_SERVER['REQUEST_TIME'];
foreach ( $crontab as $cron ) {
$slices = preg_split("/[s]+/", $cron, 6);
if( count($slices) !== 6 ) continue;
$cmd = array_pop($slices);
$cron_time = implode(' ', $slices);
$next_time = Crontab::parse($cron_time, $now);
if ( $next_time !== $now ) continue;
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
pcntl_wait($status, WNOHANG); //Protect against Zombie children
} else {
// we are the child
`$cmd`;
exit;
}
}
/* */
class Crontab {
/**
* Finds next execution time(stamp) parsin crontab syntax,
* after given starting timestamp (or current time if ommited)
*
* @param string $_cron_string:
*
* 0 1 2 3 4
* * * * * *
* - - - - -
* | | | | |
* | | | | +----- day of week (0 - 6) (Sunday=0)
* | | | +------- month (1 - 12)
* | | +--------- day of month (1 - 31)
* | +----------- hour (0 - 23)
* +------------- min (0 - 59)
* @param int $_after_timestamp timestamp [default=current timestamp]
* @return int unix timestamp - next execution time will be greater
* than given timestamp (defaults to the current timestamp)
* @throws InvalidArgumentException
*/
public static function 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("Invalid cron string: ".$_cron_string);
}
if($_after_timestamp && !is_numeric($_after_timestamp)){
throw new InvalidArgumentException("$_after_timestamp must be a valid unix timestamp ($_after_timestamp given)");
}
$cron = preg_split("/[s]+/i",trim($_cron_string));
$start = empty($_after_timestamp)?time():$_after_timestamp;
$date = array( 'minutes' =>self::_parseCronNumbers($cron[0],0,59),
'hours' =>self::_parseCronNumbers($cron[1],0,23),
'dom' =>self::_parseCronNumbers($cron[2],1,31),
'month' =>self::_parseCronNumbers($cron[3],1,12),
'dow' =>self::_parseCronNumbers($cron[4],0,6),
);
// limited to time()+366 - no need to check more than 1year ahead
for($i=0;$i<=60*60*24*366;$i+=60){
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['minutes'])
){
return $start+$i;
}
}
return null;
}
/**
* get a single cron style notation and parse it into numeric value
*
* @param string $s cron string element
* @param int $min minimum possible value
* @param int $max maximum possible value
* @return int parsed number
*/
protected static function _parseCronNumbers($s,$min,$max)
{
$result = array();
$v = explode(',',$s);
foreach($v as $vv){
$vvv = explode('/',$vv);
$step = empty($vvv[1])?1:$vvv[1];
$vvvv = explode('-',$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<=$_max;$i+=$step){
$result[$i]=intval($i);
}
}
ksort($result);
return $result;
}
}
-
PHP開發的安全問題
p給了開發者極大的靈活性,但是這也為安全問題帶來了潛在的隱患,下面是小編分享的PHP開發的安全問題,一起來看一下吧。安全保護一般性要點不相信表單對於一般的Javascript前台驗證,由於無法得知用户的行為,例如關閉了瀏覽器的javascript引擎,這樣通過POST惡意數據到服...
-
10個免費PHP腳本下載的網站
導語:你知道哪些網站可以免費寫真PHP腳步語言嗎?下面的是本站小編為大家蒐集的10個提供免費PHP腳本下載的網站,希望對你能有所幫助。Junkyard這裏提供免費的PHP腳本下載。包括PHP資源,教程,文章等等。為你提供分類列表,包括免費的PHP腳本,商業PHP腳本,PHP資源,PHP教程,網...
-
用PHP讀取文件的正確方法
處理諸如PHP之類的現代編程語言的樂趣之一就是有大量的選項可用。PHP可以輕鬆地贏得Perl的座右銘There‘smorethanonewaytodoit(並非只有一種方法可做這件事),尤其是在文件處理上。但是在這麼多可用的選項中,哪一種是完成作業的最佳工具?當然,實際答案取決於...
-
PHP考試筆試題
用寶珠打扮自己,不如用知識充實自己。以下是小編為大家搜索整理的PHP考試筆試題,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!1、{PHP題目}標識符是變量的名稱。PHP中的標識符用$+變量名來表示。標識符在PHP中遵循下列選項中的那些規則?()...
相關文章
- java使用ConcurrentHashMap和計數器實現鎖的方法
- 如何在PHP中處理Protocol Buffers數據大綱
- 如何在PHP中處理Protocol Buffers數據
- PHP如何實現Unicode和Utf-8編碼相互轉換
- php和javascript之間變量的傳遞實現代碼
- 如何用Photoshop CC中的Camera Raw來進行後期修圖
- 有關JavaScript中的prototype.bind()方法介紹
- The relationship between theory and practice大學英語作文
- php的curl實現get和post的代碼
- The Best Thing That Could Ever Happen少兒雙語閲讀