Nacházíte se zde: Úvod » Pro zákazníky » Nápověda » CRON

CRON


nahoru

Skripty v cronu

Cron slouží pro automatické pravidelné spouštění PHP skriptů. Skript umístěte do příslusného adresáře v kořeni prostoru Vaší domény podle požadovaného času spouštění a nastavte mu potřebná práva.

Je-li v jednom cronovém adresáři více skriptů, jsou spouštěny postupně podle abecedy. 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ů.

Cron spouští skripty mimo webserver, pokud potřebujete v cronu volat nějaký skript na webu (resp. určité URL), postupujte podle nápovědy volání skriptu na webu.


nahoru

Časy spouštění

Standardně cron spouští skripty v příslušných adresářích v časech:

  • 2 hodiny
  • den
  • týden
  • měsíc

Přesný čas spouštění v konkrétní periodě pro Vaši doménu najdete v klientské sekci, ve správě domény v části Webserver, kde tyto časy také můžete změnit.


nahoru

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.


nahoru

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');
?>

nahoru

Volání skriptu na webu

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.

<?php

 // Request configuration, please fill these
 $config = array(
  'base_domain' => 'example.com', // webhosting domain
  'request_domain' => 'example.com', // domain or subdomain name (also web directory name)
  'request_scheme' => 'http', // request protocol - http or https
  'script_name' => '/cron.php', // target script name, 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'];

 foreach (explode('&', $config['query_string']) as $query_item) {
  list($key, $value) = explode('=', $query_item);
  $_GET[$key] = $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 (also web directory name)
 'request_scheme' => 'https', // request protocol - http or https
 'script_name' => '/cron/cron1.php', // target script name, 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ě. 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'); ?>
nahoru

Zpět na přehled nápovědy

Další domény za akční ceny

Ocenění Českého hostingu - Nejlepší webhosting PHP + MySQL a Webhosting roku Twitter Českého hostingu

Zákaznická podpora je nyní off-line