Fórum Root.cz

Hlavní témata => Server => Téma založeno: mise 08. 02. 2016, 17:38:03

Název: Běh skriptu v časových intervalech PHP
Přispěvatel: mise 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
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: i-PRESS 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..
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 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.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Bazil_XXL 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
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 08. 02. 2016, 19:05:42
Dík, zkusím rozchodit to nodejs.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Kit 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ží.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Ondrej Nemecek 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;
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: i-PRESS 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
 

Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 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?
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Kit 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čí.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 08. 02. 2016, 22:45:41
to sice jde, ale předpokládám, že je to prasárna
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: to_je_jedno 08. 02. 2016, 23:01:17
Delat tohle v PHP a bez vlastniho serveru je vice nez krajne nevhodne.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Kit 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.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 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.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: i-PRESS 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ů?
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: andy 08. 02. 2016, 23:51:06
No jednoducho. Kupis si VPS alebo to das do nejakeho toho cloudu. Budes mat aplikaciu, ktora bude ukladat tie data a bude raz za cas pushovat na php normalnym POST dotazom. Tak nemusis nic riesit s PHP hostingom, lebo ti byvaju 100 rokov za opicami..
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 09. 02. 2016, 01:15:19
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ů?

Ani se tolik nebráním a pochopil jsem, že php není asi dobrá cesta. Neumím další jazyky kromě C, trochu PHP a ještě méně JS. Problém bude také, že "server" běží na windowsu - to nemohu změnit. Další instalace serveru s jiným jazykem tam bude asi také problém a to nemluvím o přenostitelnosti na jiné PC. Uvažuju o malém programu, který mi načte data ze zařízení, a pak mi to zpracuje php i s webem. Je tam použit WAMP server. Nevím, zda lze v něm použít i jiný jazyk nebo je tam i nějaký program pro běh událostí kromě cronu.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: i-PRESS 09. 02. 2016, 10:59:13
Jasně, chápu..


Ono PHP je vhodné opravdu na request->response, ne na akce spouštěné na pozadí. Windows již roky nepoužívám, ale nevidím důvod proč by tam neměl node jet, viz třeba http://blog.teamtreehouse.com/install-node-js-npm-windows (http://blog.teamtreehouse.com/install-node-js-npm-windows) . vypadá to jednoduše, ale je pravda že jsem nezkoušel.


Můžete si vybrat samozřejmě jazyk co se Vám líbí, akorát v nodu mi to díky obrovskému množství balíčku dostupných přes npm přijde nejjednodušší a nejméně "ukecané". Ono ani to PHP a Apache by asi nebylo potřeba, Node má integrovaný webserver a umí bleskově servírovat obsah. Já mám v node celé backendy aplikací (administrace), akorát kvůli velkému počtu přístupů má předřazen NGINX jako proxy.


Nebál bych se toho, pokud alespoň základy JS chytnete, je na nodejs hromada tutoriálů a téměř vše co budete potřebovat již pravděpodobně někdo řešil Výodou je, že co je v PHP poměrně složité, v node je to na pár řádků. Pokud už se rozhodnete se do toho pustit, otevřou se Vám navíc obrovské možnosti tvorby trvale běžících aplikací a výkon nodejs/php je nesrovnatelný.


Totéž samozřejmě můžete třeba v Pythonu, určitě na Windows fungovat bude, akorát se mi tam nelíbí práce s knihovnami (Websocket atd), takže mám node raději :)
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Kit 09. 02. 2016, 12:18:44
Ono PHP je vhodné opravdu na request->response, ne na akce spouštěné na pozadí.

Ono ani to PHP a Apache by asi nebylo potřeba, Node má integrovaný webserver a umí bleskově servírovat obsah.

... a výkon nodejs/php je nesrovnatelný.

Tohle už dávno není pravda.

Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: rooobertek 09. 02. 2016, 12:37:21
Mne php skript beží ako démon na ubuntu serveri cez malý config pre upstart. V skripte sleepujem koľko treba. Určite to ide spraviť aj vo windowse. Skúsenosti nemám, google napovedal napríklad http://sourceforge.net/projects/runasservice/
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Ondrej Nemecek 09. 02. 2016, 12:50:56
Správné řešení neexistuje - je třeba vždy porovnat požadavky, možnosti, zkušenosti, cenu, rizika... atd.

Souhlasím, že php nebylo pro trvalý běh navrženo, ale pokud ho dobře umíte nebudete mít problém napsat skript, který udělá co je potřeba a který budete spouštět třeba z plánovače windows. Taky to bude fungovat. Dejte pozor na souběh dvou instancí, skript by měl zřejmě běžet jen jednou.

Pokud je na vyzvednutí údajů měření nějaké web rozhraní, lze udělat jednoduchého klienta, který to bude pravidelně "naklikávat". Možná by stačilo i curl, ve Firefoxu lze v developers tool kopírovat jednotlivé příkazy rovnou jako curl příkazy.

Případně pokud je přístup do kódu webového rozhraní, lze prostě příslušnou část upravit a třeba přepsat do jiného jazyka a pak to může fungovat nezávisle na webovém rozhraní.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Ivan Nový 09. 02. 2016, 14:20:36
řešení je jednoduché, z cronu spustíte skript, ten udělá co má, před vlastním ukončením pomocí curl volá skript zrcadlo, který spustí ten skript znovu, o časování se stará to zrcadlo, uspí se na libovolnou dobu, protože doba spánku se na hostingu do celkové povolené doby skriptu nepočítá. Skript zrcadla může být umístěn na vašem počítači, nebo na jiném serveru, funguje i umístění na stejném serveru. Je dobré, aby jste se zrcadlem mohl komunikovat přes obsah nějakého souboru a nastavením příznaku v něm, ho mohl ovládat, nebo zastavit, kdyby se vyskytla taková potřeba.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: i-PRESS 09. 02. 2016, 14:28:31
Takže místo aplikace na pár řádků v nodu/Pythonu vezmu scripty 2, k tomu cron a budu řešit jak zabránit vytuhnutí a spuštění další instance atd..


Výborné rady :-) Domníval jsem se, že jsme alespoň na částečně odborném fóru a ne na mimibazaru.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Ivan Nový 09. 02. 2016, 14:35:13
Ano, protože hosting si nepřeje, abyste měl možnost spouštět skript cronem, jak potřebujete a na sdíleníém hostingu je vše nastaveno tak, aby to téměř nešlo. Jinak je to asi cca 30 řádků kódu.  Profesionální řešení je VPS, ale k tomu zase pak potřebujete správce, starat se o aktualizace sw, o zabezpečení před útoky atp., což je nakonec náročnější.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Ivan Nový 09. 02. 2016, 14:46:35
Takže místo aplikace na pár řádků v nodu/Pythonu vezmu scripty 2, k tomu cron a budu řešit jak zabránit vytuhnutí a spuštění další instance atd..


Výborné rady :-) Domníval jsem se, že jsme alespoň na částečně odborném fóru a ne na mimibazaru.

Většinou node ani python není k dispozici a není ani možno ho doinstalovat. Moje řešení funguje i na nejlevnějším hostingu s php a plno omezeními. A autor dotazu zřejmě takový má, jinak by se takto neptal. Obvykle bývá zde možnost spouštění cronu jednou, či dvakrát za den, doba běhu skriptu bývá omezená na 90s :-)
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Ivan Nový 09. 02. 2016, 14:48:51
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ů?

jednoduše proto, že v praxi často Node, nebo python není k dispozici. V prostředí, kde je python k dispozici, by ani takový dotaz nevzniknul.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: j 09. 02. 2016, 18:23:48
...

By se taky dalo cekat, ze tazatel aspon vi o cem mluvi... a pokud se nekdo pta, jak pacidlem zatlouct hrebik...

Protoze v tomhle pripade je uplne jedno jak to pripadne na hostingu zbastlis, pozadovanou funcionalitu (tedy garantovany 1s interval) to stejne mit nebude.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 09. 02. 2016, 18:34:51
Děkuji všem. Něco se pokusím udělat podle rad. Uvidím, co mi půjde. Nejsem uplný analfabet a umím danou funkci udělat (některá řešení zde byla uvedena). Jen to moje není zrovna profi, proto jsem chtěl poradit. Momentálně testuju prototyp a potřeboval jsem vědět, co bude vhodné. Zařízení je v podstatě PLC (PLA) - vstupy, výstupy, měření různých veličin, čidla apod. Tahle diskuze vznikla na základě rozšíření funkce zařízení o záznam dat a jeho pozdější zpracování. Placený hosting také plánuju, ale až bude všechno vyzkoušeno a budu vědět, která cesta je schůdná. Možná některé věci přenechám odborníkům. Ještě jednou díky.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Kit 09. 02. 2016, 19:25:11
Zařízení je v podstatě PLC (PLA) - vstupy, výstupy, měření různých veličin, čidla apod...

Co takhle k tomu přilepit nějakou krabičku (např. RPi, ale mohlo by to zvládnout i Arduino s Ethernetem), která z naměřených dat jednou za sekundu sestaví HTTP dotaz, pošle ho na libovolný server, kde ho PHP teprve zpracuje?
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 09. 02. 2016, 20:34:56
Není to "home made" zařízení (nic proti RPi ani Arduinu). Momentálně to běží na windows, byl to požadavek a nic s tím neudělám. Už jsem si to snad trochu srovnal v hlavě díky diskuzi a snad se uvolní finance. Později to bude vypadat následovně: Lokální server - nějaká "krabice" s hw (už nebudu tolik omezen), který bude načítat, zálohovat a prostě zpracovávat data z několika zařízení (PLC), poběží na tom "řídící" web. A z tohoto serveru půjdou vybraná data na hosting - zobrazení dalších výsledků, souhrnů, grafů apod. 
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: Kit 09. 02. 2016, 21:00:16
A z tohoto serveru půjdou vybraná data na hosting - zobrazení dalších výsledků, souhrnů, grafů apod.

Jsou dva způsoby, jak dostat data na hosting:


U druhého způsobu jde jen o to, zda to zařízení je schopno každou sekundu aktivně odesílat data - chovat se jako HTTP klient. Pokud to neumí, tak ho doplníš vhodným HW tak, aby to umělo.
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: i-PRESS 09. 02. 2016, 21:28:40
Když už tu Kit nastínil možnosti komunikace, tak ještě doplním.


Z nabízených variant se stejně jako on přikláním k 2), tedy odesílat data když potřebuji místo permanentních dotazů.


Nastínil bych i třetí variantu a to využít perzistentní spojení a využít třeba MQTT. Má to minimální režii a je to podstatně pružnější, než obsáhlý HTTP request. Prakticky by nebyl v tomto případě problém posílat či i broadcastovat zprávy třeba každých 10ms, nebo ještě méně a v konečném důsledku to pro oba stroje bude méně náročné, než HTTP požadavek.


Přidanou hodnotou pak může být to, že pokud na cílovém serveru použijete jako Message broker Mosquitto, tan ten kromě protoklu MQTT 3.1.1 podporuje i Websocket, tzn ta data můžete mít zcela live i na té vástupní stránce. V praxi se to pak řeší tak, že si tam iniciační data vysypete z PHP/Node/Python do HTML, navěsíte třeba socket.io a subscribnete si ten kanál MQTT a můžete vesele renderovat animované grafy. Je to opravdu bleskové, rychlostně skapete spíše na schopnosti browseru přerenderovat canvas, než na nedostatku dat :)
Název: Re:Běh skriptu v časových intervalech PHP
Přispěvatel: mise 10. 02. 2016, 00:00:23
To je přesně ono, co potřebuji. Díky za velké nakopnutí  :) Nevím, proč mně to nedošlo :)

MQTT (M2M apod.) by se mi líbilo, ale zařízení má velmi omezené možnosti nastavení. "Klienta" bych na tom asi rozchodit mohl. Nu, musím to překopat, ale bude to lepší.

Možná jsem se předtím špatně vyjádřil. Lokální server hlavně potřebuju pro řízení všech zařízení (PLC) a vizualizaci dat atd., proto ho chci mít "oddělen" od hostingu (nezávislý). Aplikace na hostingu by v podstatě pracovala z některých archivních dat (ne pro řízení).