Běh skriptu v časových intervalech PHP

mise

Běh skriptu v časových intervalech PHP
« kdy: 08. 02. 2016, 17:38:03 »
Chtěl bych periodicky spouštět krátký skript PHP v nastaveném intervalu v rozmezí 1-60s. Možností je sice cron, ale obávám se, že např. 1s mi hosting nedovolí. Lze to udělat i jinak? (Příp. jak to dělat správně?) Momentálně to běží na virtuálním serveru na lokálu (WAMP-musí být), později to poběží na hostingu. Jedná se o záznam měřených dat (pár bajtů), které se později zpracovávají. Prodloužit interval nemohu. Díky


i-PRESS

  • ***
  • 100
  • NodeJS, Python, Perl, Lua, PHP
    • Zobrazit profil
Re:Běh skriptu v časových intervalech PHP
« Odpověď #1 kdy: 08. 02. 2016, 17:46:24 »
A můžete tam spustit třeba NodeJS? App běží trvale a může volat přes request script třeba každou sekundu..

mise

Re:Běh skriptu v časových intervalech PHP
« Odpověď #2 kdy: 08. 02. 2016, 18:13:32 »
S node.js nemám zkušenosti a ani nevím, jestli jde nainstalovat do wampu. Mám to celé postavené na php, proto bych byl raději pro něj.

Re:Běh skriptu v časových intervalech PHP
« Odpověď #3 kdy: 08. 02. 2016, 18:57:18 »
Můžete zkusit použít můj https://github.com/vojtabiberle/QueueRunner

Je to daemon napsaný v PHP, který se v případě spadnutí PHP sám restartuje (ale na sdíleném hostingu to asi bude potřeba pořešit trošku jinak, než je to teď - mělo by stačit napsat kontrolovací/restartovací skript a volat jej jednou za čas nějakým webcronem).

Dále je napsaný adaptér jen pro MongoDB, ale adaptér je velmi jednoduchý a nebude problém jej napsat pro MySQL, i když s nižším výkonem.

S MongoDB jsme neměli problém pouštět 200 úloh víceméně současně a postupně se odbavily. S rostoucími nároky bylo potřeba vše přepsat do NodeJS: https://github.com/dvorakjan/noderunner

mise

Re:Běh skriptu v časových intervalech PHP
« Odpověď #4 kdy: 08. 02. 2016, 19:05:42 »
Dík, zkusím rozchodit to nodejs.


Kit

Re:Běh skriptu v časových intervalech PHP
« Odpověď #5 kdy: 08. 02. 2016, 19:39:23 »
Možná se to dá udělat z druhé strany: Klient má každou sekundu nová data. Pošle na server HTTP dotaz, jehož součástí budou ta data. Skript na serveru si je zpracuje a uloží.

Re:Běh skriptu v časových intervalech PHP
« Odpověď #6 kdy: 08. 02. 2016, 20:06:10 »
Nechápu, jak by měl nodejs pomoct. Celá úloha se týká pouze pravidelného spuštění příkazu, kterým se na server nahrají nově naměřená data. Anebo alternativně pravidelného spuštění requestu, na základě kterého php skript nová data odněkud vyzvedne.

Pokud jde o měření časové závislosti, je potřeba si uvědomit, zda ta měřená data obsahují i čas měření - pak totiž nezáleží na přesném intervalu vyzvedávání dat. Nejlepší by bylo to udělat, aby jedna dávka dat obsahovala sadu měření od posledního vyzveduní (čas1-naměřené hodnoty1, čas2-naměřené hodnoty2 atd.). Pak by stačilo to spouštět třeba jednou za minutu. Ale to píšete, že to nejde. Ale bylo by to nejlepší řešení.

Pravidelné souštění příkazu můžete udělat klidně skriptem v bashi, pokud nezáleží na přesném časování, stačí

Kód: [Vybrat]
while sleep 10; do curl http://cosi.cz/mereni; done;

i-PRESS

  • ***
  • 100
  • NodeJS, Python, Perl, Lua, PHP
    • Zobrazit profil
Re:Běh skriptu v časových intervalech PHP
« Odpověď #7 kdy: 08. 02. 2016, 20:24:37 »
Nechápu, jak by měl nodejs pomoct.


No třeba tím, že ta aplikace běží a může stejně jako Váš bash spouštět onen PHP script. Navíc ale narozdíl od něj dokážete kontrolovat výstup a reagovat při failu (to i ten blbej cron umí poslat mail). Spouštět nějakou službu pomocé while z bash je docela nešťastné a o chybějcích datech se také může dozvědět až od klienta, že?


Každopádně to samo nemusí být nodejs, lze využít python, perl, whatever
 


mise

Re:Běh skriptu v časových intervalech PHP
« Odpověď #8 kdy: 08. 02. 2016, 21:56:52 »
Trochu to ještě upřesním, jestli to pomůže k pochopení problému. Přes html stránku dám start měření. Spustí se tím php skript, který řekněme každou 1s (10s) načte data ze zařízení. Doba sice není kritická, ale data musím načíst, jinak o ně přijdu. Ukládají se do souboru na serveru a zobrazují se na stránce. Ukončení je stop tlačítkem. Cron nevím, jestli zvládne tento čas. A nekonečná smyčka while v php mi nepřišla úplně korektní. Jak nejlépe to řešit?

Kit

Re:Běh skriptu v časových intervalech PHP
« Odpověď #9 kdy: 08. 02. 2016, 22:04:58 »
Tak si cronem zavolej jednou za minutu to PHP, v něm udělej minutovou smyčku, ve které budeš mít na konci sleep(1) nebo sleep(10) a pak se ukončí.

mise

Re:Běh skriptu v časových intervalech PHP
« Odpověď #10 kdy: 08. 02. 2016, 22:45:41 »
to sice jde, ale předpokládám, že je to prasárna

Re:Běh skriptu v časových intervalech PHP
« Odpověď #11 kdy: 08. 02. 2016, 23:01:17 »
Delat tohle v PHP a bez vlastniho serveru je vice nez krajne nevhodne.
Děkuji za možnost editace příspěvku.

Kit

Re:Běh skriptu v časových intervalech PHP
« Odpověď #12 kdy: 08. 02. 2016, 23:05:58 »
to sice jde, ale předpokládám, že je to prasárna

Proč by to měla být prasárna? Skripty v PHP sice mohou běžet neomezeně dlouhou dobu, ale na webhostingu bývá doba běhu skriptu omezena. Sleep obtěžuje server pouze tím, že proces trčí v paměti a čeká. Výkon (na rozdíl od nekonečných smyček) nežere žádný.

Už jsem viděl hodně exotů, kteří volali SQL dotazy uvnitř cyklu a považovali to za něco úplně normálního.

mise

Re:Běh skriptu v časových intervalech PHP
« Odpověď #13 kdy: 08. 02. 2016, 23:24:07 »
Delat tohle v PHP a bez vlastniho serveru je vice nez krajne nevhodne.

Dobře, jak tedy? Podle výše uvedeného? Zatím to běží u mě na lokálu. Ano, pochopil jsem, že na hosting to není ono. Tam data budu synchronizovat hromadně ve větších intervalech.

i-PRESS

  • ***
  • 100
  • NodeJS, Python, Perl, Lua, PHP
    • Zobrazit profil
Re:Běh skriptu v časových intervalech PHP
« Odpověď #14 kdy: 08. 02. 2016, 23:48:31 »
Já jen nechápu, proč se bráníte využít k tomu jiný jazyk.


Php na není vhodná volba. PHP process má zpracovat požadavek a chcípnout, ale existují i jiné jazyky, jako Node, Python... Proč zbytečně ohýbat PHP aby se chovalo jako trvale běžící aplikace, když u jiných jazyků toho dosáhnete daleko efektivněji na pár řádků?