Nacházíte se zde: Úvod Podpora Nápověda Skripty na serveru CRON
Skripty v cronu
Cron slouží pro automatické pravidelné spouštění PHP skriptů. Související nastavení se provádějí v klientské sekci, ve správě příslušné domény v záložce Cron. Nabízíme dvě varianty jeho používání - adresářový cron a webcron.
Adresářový cron
Postupně spouští skripty nahrané v příslušném cronovém adresáři, který definuje periodu spouštění. Skriptu musejí mít nastaveno oprávnění ke spouštění.
Je-li v jednom cronovém adresáři více skriptů, jsou spouštěny postupně (tj. následující až po dokončení předchozího) podle abecedního pořadí jejich názvů. Na webserverech s PHP 5.6 a PHP 7 jsou implementovány automatické zámky, které zabrání opakovanému spuštění skriptů v případě, že jejich předchozí instance ještě běží (využívá se k tomu automaticky vytvořený soubor .tl.php.lock
). Na starších servech doporučujeme obdobnou funkcionalitu zahrnout přímo do uživatelských skriptů.
Adresářový cron spouští skripty mimo webserver a nevyčerpává tak jeho omezené prostředky (PHP procesy, spojení).
Webcron
Webcron v určený čas spustí skript na příslušné doméně, nebo některé její subdoméně, definovaný webovou adresou (URL). Webcron může vyčerpávat omezené prostředky webserveru, proto je vhodné jej používat jen pro krátce běžící skripty.
Při nastavení času a periody spouštění cronů dbejte na to, aby se více cronů nespouštělo ve stejnou dobu. Zajistíte tím lepší rozložení zátěže na serveru a tím i rychlejší vykonání skriptů (nejen těch v cronu). Na vyhrazených službách se snažte doby spouštění cronů rozložit i napříč různými doménami na serveru.
Webcron
Webcron spouští skript na příslušné doméně, nebo některé její subdoméně, definovaný webovou adresou (URL). Pokud je soubor na serveru fyzicky přítomen, spustí se přes wrapper (tedy stejně jako adresářový cron, viz Volání skriptu na webu). Pokud tomu tak není (např. z důvodu používání přepisu adres s využitím mod_rewrite), zavolá se přes webserver.
Adresu skriptu zadejte stejně, jako by jste ji zadávali do webového prohlížeče (tedy např. https://www.example.com/cron.php
). Pokud je přístup ke danému skriptu zabezpečen HTTP autentizací, zadejte adresu ve tvaru https://jmeno:heslo@www.example.com/cron.php
.
Chybná volání webcronu jsou automaticky logována do souboru webcron.log
, který je umístěn v prostoru dané domény v adresáři data. Webcron je k dispozici na webserverech s PHP řady 5.6 a vyšší (s výjimkou starých virtuálních a dedikovaných serverů). Na sdíleném hostingu je omezen počet webcronů na 5, minimální perioda spouštění je zde 15 minut. Na vyhrazených hostingových službách (tzn. virtuálních a dedikovaných serverech) žádné omezení není - tzn. webcronů je možné vytvořit libovolný počet, minimální perioda spouštění je 1 minuta.
Adresářový cron - časy spouštění
Standardně jsou vytvořeny adresáře pro spouštění skriptů v periodách 2 hodiny, den, týden a měsíc. Kromě těchto čtyřech základních si uživatelé mohou vytvořit i další adresářové crony s libovolnými časy spouštění (tato funkcionalita není dostupná na starých webserverech sdíleného hostingu s PHP 5.3 a starším, a na starých vyhrazených serverech). V klientské sekci je možné cronové adresáře vytvářet, měnit čas jejich spouštění, i je mazat. Při vytvoření nového adresářového cronu jsou k dispozici předem připravená, často používaná, nastavení, i formulář pro kompletní zadání zkušeným uživatelem.
Na sdíleném hostingu je omezen počet dodatečných adresářových cronů na 5, minimální perioda spouštění je zde 15 minut. Na vyhrazených hostingových službách (tzn. virtuálních a dedikovaných serverech) žádné omezení není - tzn. cronů je možné vytvořit libovolný počet, minimální perioda spouštění je 1 minuta.
Adresářový cron - nastavení práv spouštěných skriptů
Aby byly PHP skripty umístěné v příslušném CRON adresáři pravidelně spouštěny, je potřeba jim přiřadit minimálně práva čtení a spouštění vlastníkem, tj. r-x------, zapsáno v osmičkové soustavě 500. Obvyklé je nastavení práv u takovýchto skriptů na hodnotu 700, tedy rwx------. Nastavení práv daného souboru upravíte svým SFTP/FTP klientem.
Adresářový cron - cesta k ostatním skriptům
Jestliže z Vašich pravidelně spouštěných skriptů potřebujete pracovat s jinými soubory, umístěnými v adresářích Vaší domény, zadávejte cestu relativně ke kořenovému adresáři prostoru domény, nikoliv k adresáři CRON, ve kterém je spouštěný skript. Pracovním adresářem skriptů spouštěných z cronu je kořenový adresář uživatelského prostoru domény.
Příklad:
Máte napsaný skript promaz.php
, který se bude pravidelně každý den připojovat na databázi MySQL, je tedy v adresáři CRON.den
. Přihlašovací údaje k databázi máte uložené zvlášť, v souboru db.php
, který je společně s promaz.php
v adresáři CRON.den
, ale není spustitelný (viz nastavení práv výše).
Skript promaz.php
pak bude obsahovat:
<?php require_once('CRON.den/db.php'); ?>
Adresářový cron - volání skriptu na webu
Adresářový cron funguje nezávisle na webserveru. Výhodou tohoto řešení je, že fungování webserveru (např. reload při změně konfigurace) nezasahuje do běžících cronových skriptů, a také třeba fakt, že cronové skripty nevyčerpávají PHP procesy. Nicméně pravidelné volání nějakého skriptu na webu je možné. Jsou dvě možnosti, jak je zajistit:
Cron wrapper
První možnosti je využití níže uvedeného cronového skriptu (nebo nějaké jeho obměny), který zajistí vykonání požadavku mimo webserver, ale nastaví prostředí tak, jakoby požadavek byl přes webserver vykonán (tzn. stejně jako byste cílové URL zadali do prohlížeče). V cílovém skriptu tak například nemusí být řešen odlišný pracovní adresář cronu. Kod zkopírujte do souboru a upravte údaje v horní části. Níže uvedená vzorová konfigurace slouží pro vykonání požadavku http://example.com/cron.php nebo též http://www.example.com/cron.php (kód je pro obě tyto varianty stejný).
<?php // Request configuration, please fill these $config = array( 'base_domain' => 'example.com', // webhosting domain 'request_domain' => 'example.com', // domain or subdomain name - directory name on webserver 'request_scheme' => 'http', // request protocol - http or https 'script_name' => '/cron.php', // existing target script name (no rewrite or redirect!), including path (when in subdirectory) 'query_string' => '', // request variables ); // Request execution, nothing needs to be changed down here $_SERVER['SCRIPT_NAME'] = $config['script_name']; $_SERVER['REQUEST_URI'] = $config['query_string'] != '' ? $config['script_name'].'?'.$config['query_string'] : $config['script_name']; $_SERVER['QUERY_STRING'] = $config['query_string']; $_SERVER['REQUEST_METHOD'] = 'GET'; $_SERVER['REMOTE_PORT'] = 10000; $_SERVER['SCRIPT_FILENAME'] = '/home/www/'.$config['base_domain'].'/www/'.$config['request_domain'].$config['script_name']; $_SERVER['CONTEXT_DOCUMENT_ROOT'] = '/home/www/'.$config['base_domain'].'/www/'.$config['request_domain'].'/'; $_SERVER['DOCUMENT_ROOT'] = $_SERVER['CONTEXT_DOCUMENT_ROOT']; $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; $_SERVER['SERVER_ADDR'] = '127.0.0.1'; $_SERVER['SERVER_NAME'] = $config['request_domain']; $_SERVER['HTTP_HOST'] = $config['request_domain']; $_SERVER['SERVER_SOFTWARE'] = 'Apache/2.4.10 (Debian)'; $_SERVER['PHP_SELF'] = $config['script_name']; $_SERVER['REQUEST_SCHEME'] = $config['request_scheme']; $_SERVER['HTTPS'] = $config['request_scheme'] == 'https' ? 'on' : ''; foreach (explode('&', $config['query_string']) as $query_item) { list($key, $value) = explode('=', $query_item); $_GET[$key] = $value == null ? '' : $value; } chdir(dirname($_SERVER['SCRIPT_FILENAME'])); require $_SERVER['SCRIPT_FILENAME']; ?>
Druhý příklad (už jen) konfigurace je pro vykonání požadavku https://my.example.com/cron/cron1.php?task=run&id=5:
$config = array( 'base_domain' => 'example.com', // webhosting domain 'request_domain' => 'my.example.com', // domain or subdomain name - directory name on webserver 'request_scheme' => 'https', // request protocol - http or https 'script_name' => '/cron/cron1.php', // existing target script name (no rewrite or redirect!), including path (when in subdirectory) 'query_string' => 'task=run&id=5', // request variables );
Volání přes webserver
V cronovém skriptu je samozřejmě možné iniciovat i zavolání přímo přes webserver, využijete je například když chcete volat skript na nějaké jiné doméně (pro volání skriptu na stejné doméně to vhodné není, protože to zbytečně vyčerpává prostředky webserveru). Využít k tomu je možné třeba PHP funkci file_get_contents, nebo funkce PHP rozšíření cURL. Následuje jednoduchý příklad skriptu do cronu pro zavolání skriptu na adrese http://www.example.com/cron.php.
<?php file_get_contents('http://www.example.com/cron.php'); ?>