Autor Zpráva
UNB
Profil
Potřeboval bych mít radu od Vás, a hledal jsem diskusi a různé weby, a pořád nemám jistotu, proto se tady obrátím na diskusi.
Chci vědět jak postupně udělat CRON PHP?

Zaprvé vím, že chci spustit skript - 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /Users/Laborator/Web/skript.php
Úvodní index webu je /Users/Laborator/Web/index.php

1. Mám uložit soubor s názvem: cron.php a v souboru bude obsažen 1 řádek: 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /Users/Laborator/Web/skript.php
Kám mám vkládat cron.php? Do index.php a tam přidat řádek jako include("cron.php"); ?
2. Co dál? Už to nevím..., prosil bych od Vás radu o postupně krok za krokem.
3. Používám MAMP PRO, OS: Mac OSX Mountain Lion.
4. Nebo je možné používat Windows XP :-)

Děkuji a budu se tešit na reakci od Vás.
Joker
Profil
UNB:
V první řadě, CRON nesouvisí s PHP, je to proces operačního systému. Čili to nebude cron.php, ani se nevkládá do PHP souboru.

Nevím přesně, kam se v MacOS dává definice pro CRON (crontab?), možná nejjednodušší bude si na to najít v repozitáři nějakou klikací aplikaci.

Windows místo CRONu mají Naplánované úlohy, řešilo se to třeba zde
smiesek
Profil
nerada bych zakládala stejný název tématu a tak svůj dotaz připojím zde.
Stejně jako autor příspěvku se snažím zatím marně dohledat, jak vytvořit cron a jaký je postup vytvoření.

Jde mi např. o jednou za týden smazat všechny prázdné adresáře z webu, nebo zaslat jednou za období e-mail, ale prostě netuším prosím odkama se odrazit a úspěšně vše dotvořit, aby to fungovalo, hlavně cron, nejde mi o jednotlivé funkce přikazů jak sestavit kod pro smazání adresáře nebo jak zaslat e-mail, ale spíše jakými parametry a kam nastavit cron.

Zkoušela jsem hledat i na internetu, ale nikde se mi nepodařilo najít ukázkový příklad.

Děkuji za navedení a pomoc.
Giga
Profil
Cron je služba operačného systému Linux.
Internet poskytuje veľa návodov, napr: www.linuxexpres.cz/praxe/cron-spravca-uloh
juriad
Profil
smiesek:
Ty cron nevytvoříš, cron je služba operačního systému, poskytuje jej webhosting. Originální verze cronu měla konfiguraci v souborech formátu:
minuty hodiny dny měsíce dny-v-tydnu příkaz-který-spustit
Ale hosting muže nabízet nějakou jinou zmršenou verzi, třeba změnu hodnot jen skrze webové rozhraní hostingu, nebo nemožnost častější akce než jednou za hodinu, nebo změnou formátu, že nezadáváš příkaz, ale adresu stránky.

Často ani Cron není poskytovaný (viz třeba pro webzdarma: http://faq.webzdarma.cz/otazka.php?25). Existují ale webové služby, které jako cron mohou fungovat. Nastavíš v nich jak často má robot přistoupit na některou tvou stránkou.
Třeba zajistí, že každou hodinu bude spuštěn tvůj soubor udrzba.php; ten ale může „náhodou“ spustit i kdokoli jiný, a proto bys měla kontrolovat, zda byl spuštěn ve správný čas a případně treba vyžadovat v URL heslo, například: ?pass=123456
smiesek
Profil
aha, tak asi už tomu začínám rozumnět. Mohu vytvořit tedy stránku, kde bude vložený kod pro danou operaci např. test.php bude obsahovat kod rmdir.
Následně nastavení cronu provedu v administraci hostingu, alespoň takhle jsem to pochopila u poskytovatele (jedná se mi o wedos).
Já jsem měla jinak vždy za to, že se nějaký příkaz vkládá třeba do nějakého souboru (.htaccess)
juriad
Profil
Všechno je to popsané ve znalostní bázi: http://kb.wedos.com/webhosting/cron.html
smiesek
Profil
pokud se všude dočítám o souboru crontab, je tím myšlena následující podoba crontab.txt? Nebo jakou příponu mají mít tyto soubory crontab?
TomášK
Profil
Ne. Název souboru, ve kterém je to uložené, tě nemusí zajímat. Edituje se totiž spuštěním programu crontab (crontab -e) nebo přes nějaké jiné rozhraní - na wedosu přes web. Se samotným souborem nikdy přímo nepracuješ.

A pokud by tě to zajímalo, uživatelské crontaby bývají uložené ve /var/spool/cron/<username>, systémové v /etc/cron.*. Ty systémové se editují přímo, ale hádám, že bude chvíli trvat než budeš chtít něco takového dělat.
blaaablaaa
Profil
smiesek:
Soubory cronu jsou nejspis v /var/spool/cron/, ale to ty vubec nepotrebujes vedet, editujes ho pomoci crontab -e. Pripadne vetsina webhostingu ma napsanou nejakou klikaci webovou spravu.

//edit: koukam, ze TomasK uz me predbehl :)
smiesek
Profil
já stejně pořád tomu nerozumím, když se mluví o cronu :(
Nechápu to ani ze žádných článků, co se mi daří vygooglit.

Potřebuju názorný příklad pro blbečky. Třeba pro odesílání e-mailu a nebo jednou týdne smazat(vyprázdnit data z tabulky, to je fuk)

Musím tedy si napsat do nějakého souboru s příponou .php, např. sendmail.php SQL dotaz, který kdybych zadala jeho URL do prohlížeče (nebo na něj klikla), poslal dle SQL dotazu e-maily a ten cron, který bývá jedno řádkový se pak zadává někde do nějakého souboru a nebo té kliklací správy?

Budu mít soubor sendmail.php
Obsahem bude mimo jiné i SQL dotaz společně se scripte pro odeslání e-mailu
SELECT email FROM osoba

řádek cronu bude
0 1 * * * /sendmail.php

a co pak? Kam přesně s tím řádkem do nějakého crontabu, nebo té klikací správy?
TomášK
Profil
Základní idea je správně, ale přesné to není. Soubor, který se spustí v cronu musí být spustitelný skript. Ne nutně v php, většinou v bashi. Takový skript, který se provede, pokud ho zadáš na příkazové řádce. Pro php by příkaz vypadal takto (se správnou cestou k php):
0 1 * * * /path/to/php sendmail.php
Máš-li vymyšlené, jak bude řádek v crontabu vypadat, je potřeba spustit program crontab -e. Ten program otevře textový editor, kam je potřeba napsat ten řádek. Po uložení editoru se zapíše na správné místo. Příkazem crontab -l jde zobrazit seznam příkazů, které jsou v crontabu zapsané. Nebo to celé naklikat v administraci.
smiesek
Profil
a ten program se jak spustí? V jaké administraci?

Jak udělám z php spustitelný script?

Omlouvám se, ale vůbec mi nic z toho není jasné a tedy nedokážu nic vytvořit, nevím čeho se chytit.
juriad
Profil
smiesek:
V podstatě jsou dva typu cronu:
* ty v operačním systému - ty se chovají přesně jak TomášK popisuje. Ty tě ale ve skutečnosti nezajímají.
* hostingové - ty jsou omezené na to, že umí spustit jen PHP skripty.

Co tedy dělat?
Vytvoř klasický PHP skript pokusny-mailer.php v adresáři [pre]cron; pro pokus a pochopení postačí něco jako toto:
<php
if (isset($_GET['heslo']) && $_GET['heslo'] == 'moje-tajne-heslo') {
  mail('smisek123@seznam.cz', 'Pokus', 'Toto je pokusný e-mail, který se odešle automatikcy každých x hodin pomocí cronu na mém hostingu.');
  echo "E-mail byl odeslán";
}

Pak v konfiguraci hostingu (tedy v žádných souborech ani pomocí programu crontab) nastavíš:
Název: odeslání pokusného e-mailu každou hodinu
Spouštět 1x za: 1 hodina
Hodiny ve dne: 0 - 23
Dny v týdnu: vše
Datum: nevyplnit
URL skriptu: http:/<tvoje-subdomena>.<tvoje-domena>/cron/pokusny-mailer.php?heslo=moje-tajne-heslo
(Tuto konfiguraci máš dopodrobna popsanou na kb.wedos.com/cs/webhosting/cron.html)

Cron na hostingu v podstatě simuluje prohlížeč, který přistoupí na adresu:
http:/<tvoje-subdomena>.<tvoje-domena>/cron/pokusny-mailer.php?heslo=moje-tajne-heslo
v datumy a časy, které jsi nastavila. Zkus tu adresu sama zadat do prohlížeče.

Jedná se o úplně obyčejný skript. Nemusiš dělat vůbec nic proto, aby se stal spustitelným. Dokonce tam můžeš zadat: http:/<tvoje-subdomena>.<tvoje-domena>/index.php, což ti bude generovat návštěvu úvodní stránky (jakkoli neužitečné to je).

Zmíním se ještě o obsahu toho skriptu:
Ta if podmínka tam je proto, aby někdo náhodou nepřišel na adresu http:/<tvoje-subdomena>.<tvoje-domena>/cron/pokusny-mailer.php a tím ti neposlal e-mail. Je to jen taková ochrana.
Dále jsem tam přidal echo, které v případě spuštění pomocí cronu nikdo nikdy neuvidí, ale když to budeš testovat v prohlížeči, tak se ti bude hodit. Ono by šlo použít třeba funkce ob_*, kterými bys vše, co skript vypíše, zapsala do souboru; takové primitivní logování.
smiesek
Profil
juriad: super, děkuju, nyní pomalu se dostávám k tomu pochopení, o co mi hned na začátku šlo.

Chápu soubor tak, jak jsi jej podmínkou if i ošetřil, že v opačném případě bych je mohla klidně spustit zadáním URL do prohlížeče a žádný cron bych pak nemusela nastavovat. Nyní mi to je srozumitelné.

Ještě bych ráda poprosila, jestli by jsi mi mohl, pokud to není složité pro mě jako laikovi na vysvětlení, jakým způsobem by se udělal a vytvořil (třeba tady by se už někde vytvořilo moje toužebné crontab) přikaz pro cron o kterém píše TomášK a kam by se umístil soubor pokusny-mailer.php, v tom případě, že bych jej chtěla vyzkoušet na localhostingu a nebo bych třeba hosting neměla u wedosu?

Děkuju za čas a trpělivost.
juriad
Profil
Pokud se jedná klasický linuxový crontab, php soubor vytvoříš úplně stejně. Ale pozor, bude zpracován pomocí konzolové verze PHP a to má několik odlišností:
* používá se jiná konfigurace PHPjiný soubor php.ini), takže ne vše se musí chovat stejně. Například nemusí být podporovaná databáze (funkce mysql_*, mysqi_*), práce s obrázky, matematika s libovolnou přesností atp. Dobré je si to ověřit pomocí funkce phpinfo, která ti ukáže, kterou konfiguraci PHP používá.
* nefungují parametry $_GET, $_POST, $_COOKIE, $_SERVER, protože je z příkazové řádky nemá kdo nastavit; o to se obvykle stará webový server, který spuštěním z cronu obejdeš; tyto paramery lze nahradit pomocí pole $argv (hledej na StackOverflow)

Crontab je záznam příkazu, který se má v určitou dobu spustit. Každý záznam má 6 sloupců, které jsou oddělené mezerami:
1. Minute [0,59]
2. Hour [0,23]
3. Day of the month [1,31]
4. Month of the year [1,12]
5. Day of the week ([0,6] with 0=Sunday)
6. Příkaz, který se má spustit
U těch prvních pěti je možné zadat hvězdičku, která znamená, že kritérium se neuplatňuje; je možné zadat rozsah a je obvykle možné zadat násobek. Toto je dobře popsané všude na webu.
Za příkaz, který chceš spustit se považuje celý zbytek řádku. Abys nemusela dělat čachry s nějakým povolováním spuštění atp., tvůj příkaz bude vypadat takto:
/cesta/k/programu/php -dalsi-prepinace -f /cesta/v/souborovem/systemu/ke/skriptu/nazev-skriptu.php parametry oddělené mezerami
* Cesta k PHP bude obvykle /usr/bin/php, ale může se to lišit v závislosti na tom, zda chceš použít konkrétní verzi PHP; teoreticky není nutné uvádět celou cestu, ale je to bezpečnější
* Přepínače slouží k řečení PHP, co jak má dělat; tebe může zajímat přepínač -c /ceta/k/souboru/php.ini, tímto můžeš vynutit použít stejnou konfiguraci, jako je použitá webovým serverem
* Cesta ke skriptu musí být na souborovém systému, nikoli to, co zadáváš do prohlížeče; například to může být někde v /srv/http/ nebo /var/www/; každý systém má webové stránky uložené jinde. Skript může být v systému umístěn kdekoli, nemusí být ve stejném adresáři jako zbytek aplikace, ono je často dokonce lepší ho dát jinam, aby jej z venku nikdo nemohl spustit.
* Parametry, které zadáš za název skriptu najdeš v poli $argv, jak jsem zmínil výše.
Celý příklad může tedy být:
0 * * * * /usr/bin/php -f /var/www/smiesek.cz/cron/pokusny-mailer.php
Celé to znamená: vždy, když je celá hodina, spusť pomocí programu php skript pokusny-mailer.php

A teď to nejdůležitější: crontab edituješ programem crontab s přepínačem -e:
crontab -e
Toto ti otevře editor, ve kterém si zadefinuješ, co potřebuješ; mně například vypisuje následující hlavičku:
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
Po uložení souboru si cron přečte záznamy a bude se podle nich dále chovat.

A jako vždy, příkazy man crontab a man php jsou tvými kamarády.
smiesek
Profil
takže na localu si funkci cron nevyzkouším?

To, že jsem zase na začátku a vytvořila jsem soubor .php s příkazem, který se má do DB provést, jsem pochopila, ale pak to ostatní už ne.

Snad ještě to, že si musím pamatovat cestu, do které složky jsem jej dala, abych na soubor mohla následně odkázat příkazem.

Ale kam se nyní zadává ten příkaz? To si vše už pak nastavuju jak tu cestu tak příkaz v tom editoru? Kde jej mám nainstalovaný a kde jej mám umístněný? Na webu, u sebe na PC doma?

Nerozumím tomu.
TomášK
Profil
smiesek:
cron je systémová služba, která běží na linuxu. Pokud máš linux, můžeš si na localu cron vyzkoušet. Ve většině distribucí je ve výchozí instalaci. Máš-li windows, pak ne - tam je alternativa Windows Task Scheduler resp. schtasks. Dělá to totéž, ale nastavuje se to jinak.
smiesek
Profil
Dobře, budu se tedy držet toho, že následně to, co jste se mi tady snažili vysvětlit vyzkouším pouze u WEDOS serveru.

Děkuju za váš čas.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: