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:
kaip sukurti cronjob pvz

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