Php Cronjob'ai
Parašė ozzWANTED 2010 spalio 31 18:10:13
Dažnai reikia kažkokias operacijas automatizuoti, ir nebūtinai tai reikia daryti 'user-online' pagrindu.
T.y., nemažai programuotojų realizuoja šį dalyką, kaskart kraunant saitą, tikrinti laiką, ir jeigu tai spec. laikas ir dar nebuvo įvykdytas cronjob'as, tuomet įvykdo php skriptą.
Tačiau yra ir kitas sprendimas - tikrieji cronjob'ai.
Tikrieji cronjob'ai uždedami per SSH VPS serveriams, arba per Direct Admin, jeigu turite Cronjob galimybę.
1 aspektas - Php lokacija:
CentOS4,5 serveryje ji tikėtina kad bus:
/usr/local/bin/php
Kituose serveriuose ji gali būti ir tokia:
/usr/local/bin/php
Tikslų kelią galite sužinoti įsikėlę į savo serverį phpinfo.php failą, arba per pridėtinius puslapius įvykdę:
<?php echo phpinfo() ?>
Bei pažiūrėję prie eilutės:
open_basedir : <kažkas>:<kažkas>:/usr/local/lib/php/
Tai ir bus pilnas kelias serveryje iki Php direktorijos.
2 aspektas - kelias iki Jūsų failo (PATH/TO/FILE):
Tai turi būti pilnas kelias, pateikame
3 aspektas - įvykdomo failo CHMOD:
Turite būti tikri kad failas turės EXECUTE priegą, t.y. CHMOD 755 ar panašus.
Taigi, prisijungę prie DA, ir atsidarę savo domenui CRONJOBS, matote tokius laukelius:
Minute [_____] 0-59
Hour [_____] 0-23
Day of Month [_____] 1-31
Month [_____] 1-12
Day of Week [_____] 0-7 (0 or 7 = Sunday)
Command [___________________]
Į auksčiau esančius laukelius galite įvesti:
"*", t.y. operacija bus vykdoma kiekvieną ciklą.
skaičių, t.y. operaciją bus vykdomą tik esant tam tikram laiko vienetą, parašyta
Na o pati komanda atrodytų taip:
/usr/local/bin/php -q /home/DA_LOGIN/domains/DOMENAS.LT/public_html/cronjob.first.php
Paveikslėlis:
Jeigu dar patys ir redaguojate CronTab'ą, t.y. /etc/crontab serverio failą, tai komanda būtų tokia:
/usr/local/bin/php -q /home/DA_LOGIN/domains/DOMENAS.LT/public_html/cronjob.first.php
(skriptas bus vykdomas kasdien 5:55 val ryto).
Alternatyva, jeigu Jūsų php buvo instaliuotas naudojant "Apache" modulį, būtų naudoti "Lynx browser" naršyklė. Tai minimali, tekstinė naršyklė UNIX/Linux sistemose. Tokiu atveju Cronjob'as per DA atrodytų taip:
lynx -dump http://www.somedomain.com/cron.php
Jeigu dar patys ir redaguojate CronTab'ą, t.y. /etc/crontab serverio failą:
55 5 * * * lynx -dump http://www.somedomain.com/cron.php
(skriptas bus vykdomas kasdien 5:55 val ryto).
----------
Kita alternatyva, yra kviesti visą tai per php failą pasinaudojus atsitiktiniu lankytoju, kuris tą skriptą, to nežinodamas, paleis. Šią galimybę realizuoja ir Php-Fusion nuo v7.01 versijos (vartotojų automatizuotas banų nuėmimas ir pan.)
<?php
/* @description - Simple class for managing cronjobs, possible further extensions
* @author - ozzWANTED
* @date - 2010-10
* @version - 1.0
*/
class CronManager {
// Simple cron by ozzWANTED @ 2010-10
public static function do_cronjob($path_to_file, $minute="*", $hour="*",$day="*", $month="*", $day_of_week="*")
{
$pass = true;
// Mins
if(is_array($minute) && !in_array(date("i"),$minute))) $pass = false;
else if($minute != date("i") && $minute != "*") $pass = false; // Mins with leading zero, ex. 00-59
// Hours
if(is_array($hour) && !in_array(date("H"),$hour))) $pass = false;
else if($hour != date("H") && $hour != "*") $pass = false; // Hours with leading zero, ex. 00-23
// Days
if(is_array($day) && !in_array(date("d"),$day))) $pass = false;
else if($day != date("d") && $day != "*") $pass = false; // Days with leading zero, ex. 01-31
// Months
if(is_array($month) && !in_array(date("m"),$month))) $pass = false;
else if($month != date("m") && $month != "*") $pass = false; // Months with leading zero, ex. 01-12
// Weekday's
if(is_array($day_of_week) && !in_array(date("N"),$day_of_week))) $pass = false;
else if($day_of_week != date("N") && $day_of_week != "*") $pass = false; // Days of Week, Php 5.1.0+, ex. 1-7
// if passed, do cronjob
if($pass)
{
include($path_to_file);
return true;
} else
{
return false;
}
}
}
$crons = array(
0 => array("cron1.php", "55","05","*", "*", array("1", "3", "5"))
);
// FOR DUMB's and NOOBS - do cronjob
CronManager::do_cronjob($crons[0]);
// FOR ADVANCED users
$cron = 0; $period = 24*60*60;
if(dbrows(dbquery("SELECT last_cron FROM ".DB_CRONJOB." WHERE cron_id='$cron' AND last_cron<(UNIX_TIMESTAMP()-$period)"))) {
CronManager::do_cronjob($crons[0]);
dbquery("UPDATE ".DB_CRONJOB." SET last_cron=UNIX_TIMESTAMP() WHERE cron_id='$cron'");
}
?>
Kodas taip pat įkeltas ir čia:
https://webdnd.com/php-cronjobai,k574
2010 (C) ozzWANTED @ PhpFusion-LT.com