Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Wangarad 31. 03. 2021, 08:21:51

Název: PHP výběr obrázku na základě data vytvoření
Přispěvatel: Wangarad 31. 03. 2021, 08:21:51
Dobry den.
Mam trosku problem.
Zadanie: Kamera generuje obrazky s random nazvom. Potrebujem tieto obrazky nacitat do stranky podla casu ale jedine info co mam je len datum vytvorenia. Cele to musi byt v PHP. Popravde ani netusim ako vybrat subor na zaklade datumu vytvorenia. Vedel by niekto poradit ako na to? (tych obrazkov je tam denne cez 6000)
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: czipis 31. 03. 2021, 08:32:59
https://www.php.net/manual/en/function.filemtime.php

nacist, seradit, zobrazit jenom tolik nejnovejsich kolik vas zajima
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 10:21:15
Asi by bylo víc na místě brát datum z IPTC / EXIF, než z filesystému. Tam stačí provést nějakou operaci, datum se cinkne, a celý mechanismus půjde do pryč. S IPTC / EXIF se z PHP pracovat dá.

Jiná věc je, že pročesávat 6000 fotek bude relativně výkonově náročné.

Osobně bych použil některý z nástrojů v příkazové řádce, které umějí EXIF / IPTC načíst a navrátit třeba jako json. V něm se pak dá dobře vyselectovat např. pajpou do databáze (postgresql). Bude to určitě rychlejší a efektivnější i spolehlivější, než to patlat v PHP.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: PanVP 31. 03. 2021, 13:35:11

Máte 6000 krabic a hledáte červenou botu. Tj. prohledáte 6000 krabic, najdete tu krabici s červenou botou a pak znova?
Blbost, nemluvte do věcí, které neznáte. A chápete, jak velký cirkus by to s tou databází byl?


Takže postup číslo 1 - pomůžu si Ramdiskem - tj. disk v paměti!
PHP vezme obrázek, zobrazí ho a VŠECHNY OBRÁZKY SMAŽE... pak znova.... a znova.... a znova...
Obrázky pořád přitékají, tak to je v pohodě.
Na pozadí mi běží služba, která obrázky po minutě smaže, třeba něco jako:
find . -name "access*.log" -type f -mmin +15 -delete

Varianta:
PHP smaže všechny obrázky, počká, až se nějaký objeví, zobrazí ho a zase znova.
(Ten skript trochu blokuje, ale to je fuk.)
Opět doporučuji posílat data na Ramdisk.

Varianta:
PHP mi pustí pythlounový skrip, který mi připraví "tohlezobraz.jpg".
Klidně by tam mohla běžet i malá službička, která obrázky z kamery přijímá.
Pak by šlo dělat i docela pěkné vychytávky.

Řešení je celá hromada a žádné nepotřebuje databázi. Jo a složité souborové operace (hledání) jen zdržují.
Jistě vás napadne, jak to řešit elegantněji, než takhle.

BTW, tohle je úkol pro studenta druhého ročníku IT SŠ?
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 13:38:51
...

Já neřekl, ukládat data do DB, ale využít její schopnosti pracovat s JSON a datetime datovými typy.
Něco ve smyslu SELECT ... FROM (VALUES (json)). DB jsou na takové operace vybavené, zatímco v PHP to bude smyčka a slepenec operací.

Pokud lze obrázky po zpracování mazat nebo přesouvat, je samozřejmě nejlepší to, co píšete. To ovšem v zadání nečtu.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: PanVP 31. 03. 2021, 13:43:36
To ovšem v zadání nečtu.

Já zase v zadání nečtu, že není možné s obrázky pracovat na úrovni adresáře.
Takže opět obhajujete neobhajitelné.

A mazání samozřejmě nutné není, klidně se dají přesouvat někam na pevný disk nebo do jiného adresáře.
Dokonce se ani nemusí mazat, stačí je přejmenovat a ani se nemusí měnit přípona souboru.
Takže tu máme další řešení.
Starší soubory se prostě budou jmenovat původnínázev.uzjsemvidel.jpg

Snad všechno je lepší než dokola přehrabovat XY set nebo tisíc souborů.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 14:01:34
Takže opět obhajujete neobhajitelné.

Nikoliv, pouze se snažím do zadání nedomýšlet to, co v něm není. Je tam hovořeno pouze o načítání.
Pokud je možno s nimi pracovat (přejmenovávat, přesunovat), je celý dotaz o ničem a špatně formulovaný.

Kód: [Vybrat]
exiftool -d "%Y-%m-%d %H:%M:%S" -j -iptc:all * navrátí zformulovaný JSON se vším, co je potřeba. Datum, čas, jméno souboru a další. S JSON se pak můžete patlat v PHP, nebo na to využít nějaký další nástroj - třeba tu DB. Hotovo za dvacet minut, bez jediného ojebu v PHP.

Teď jsem si to zkoušel, 6000 jpegů (velkých - v průměru 1,5 MB) mi to na rotačních discích zpracovalo za 2:15.
U malých obrázků, případně na SSD (nebo ramdisku) to bude samozřejmě o poznání rychlejší.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: PanVP 31. 03. 2021, 14:12:58
je celý dotaz o ničem a špatně formulovaný

::)  :o Jo tak  ;D

6000 obrázků ... zpracovalo za 2:15
;D  :P   ;D
Tak dobře no ;D Vyhrál jste  ;D

Když se tam přidá stránka s odpočtem, kdy bude možné obrázek zobrazit, tak bezva.
A není trochu nevýhoda, že za ty dvě minuty tam přibude pár dalších obrázků? ;D
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 14:17:26
je celý dotaz o ničem a špatně formulovaný

::)  :o Jo tak  ;D

6000 obrázků ... zpracovalo za 2:15
;D  :P   ;D
Tak dobře no ;D Vyhrál jste  ;D

Když se tam přidá stránka s odpočtem, kdy bude možné obrázek zobrazit, tak bezva.
A není trochu nevýhoda, že za ty dvě minuty tam přibude pár dalších obrázků? ;D

Aha, tak to jsem snad ani nepředpokládal, že by někdo chtěl on-the-fly dělat 6000 operací, ať už nad EXIFEM, nebo nad filesystémem. To je sebevražda. Tímto způsobem lze pouze získat data o tom, kdy vznikl jaký obrázek a pak s tím pracovat. (Uznávám, tady jsem naopak domyslel něco já)
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: PanVP 31. 03. 2021, 14:38:09
Aha, tak to jsem snad ani nepředpokládal, že by někdo chtěl on-the-fly dělat 6000 operací

Potrebujem tieto obrazky nacitat do HTML stranky podla casu ale jedine info co mam je len datum vytvorenia. Cele to musi byt v PHP.

Web + PHP ...alespoň ve mně DOST evokuje on-the-fly.

A protože tam přitéká nový obrázek evidentně co 14 vteřin, může být nejsnazším řešením třeba cronový task, který mění název souboru na požadované jméno.

Co by cronový task - spuštěný každých 14 vteřin - mohl dělat:
Zapíše (přípíše) do "tohleJeVlozene.html" text "Záznam TIME %h%m%s-%d%M%R" (soubor tak zároveň slouží jako log - super na ladění, protože vím, kdy mi vyplivla kamera nebo služba)
Podívá se do adresáře a pokusí se najít obrázek.
Pokud ho najde, přesune ho do adresáře "data" a jejich názvy vloží opět do "tohleJeVlozene.html"
PHP aplikace pouze vloží do stránky "tohleJeVlozene.html" a kromě toho nedělá vůbec nic.
Z mého pohledu to je další možnost a práce na pár minut  ::)
...takže DALŠÍ možnost...

Ale odpadne tam možnost uvařit si kafe, než se těch 6000 souborů zpracuje...

Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 14:43:31
...

Souhlas, těch řešení se nabízí víc.
Já bych třeba volil (osobní preference) zpracovávat to jednou za čas a mít v DB i uložené informace vyseparované z EXIFU. Task by pak neprocházel 6000 obrázků naráz, ale jen pár kousků, co přibyly. Pokud nebudou mít každý 1,5 MiB, jako jsem si zkusil já, tak to bude zase kratší.

Ono tuhle myšlenku můžeme rozvíjet do nekonečna, protože nemáme další informace. K zamyšlení taky je, jak bude vypadat adresář, pokud do něj jen přibývají obrázky a neubývají. Pak už bude jen samotné vylistování adresáře docela zdržující.

Pokud je možnost přesouvat na disku, pak bych nějakým taskem obrázky přejmenoval a do jména souboru dal informaci o času vzniku a rozhodil je do stromu podle dnů, případně ještě o level víc, podle hodiny.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: czipis 31. 03. 2021, 15:04:50
pokud jde o prochazeni mtime nad 6000 soubory, tak jsem ted vyzkousel a na beznem SSD s ext4 to cele trva 0.06s
Kód: [Vybrat]
foreach (scandir($dir) as $filename) echo "$filename " . filemtime($filename) ."\n";coz mi neprijde jako cas na to uvarit si kafe...

Kód: [Vybrat]
$ time php dir.php >/dev/null

real 0m0.060s
user 0m0.025s
sys 0m0.035s

EDIT: omluva, mel jsem to v diskovaych cache. po vysypani cache je to

Kód: [Vybrat]
# sync; echo 3 > /proc/sys/vm/drop_caches
# time php dir.php >/dev/null

real 0m0.361s
user 0m0.040s
sys 0m0.135s
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 15:11:09
pokud jde o prochazeni mtime nad 6000 soubory, tak jsem ted vyzkousel a na beznem SSD s ext4 to cele trva 0.06s
Kód: [Vybrat]
foreach (scandir($dir) as $filename) echo "$filename " . filemtime($filename) ."\n";coz mi neprijde jako cas na to uvarit si kafe...

Kód: [Vybrat]
$ time php dir.php >/dev/null

real 0m0.060s
user 0m0.025s
sys 0m0.035s

Tím získáte čas zapsání souboru na disk, ale to vůbec nevíte, jestli je čas vzniku fotografie. To se ukrývá v exifu.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: qelurg 31. 03. 2021, 15:44:25
Pánové, v zadání žádná práce s obrázky (přesouvání, přeumenování) není, natož ve formě nějaké služby. Požaduje se jejich zobrazení pomocí php podle blíže neupřesněného času. Takže v první řadě je potřeba zjistit porle jakého času se to má posuzovat a zda to neběží na filesystému, který uchovává informaci create time nebo zda to má být oddolné proti modifikacím. Teprve pak lze navrhovat řešení, popř. zjišťovat další informace, jako je jak hluboko do historie, zda je to volitelné, zda je to single nebo multi, zda je možnost databáze.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: PanVP 31. 03. 2021, 16:19:21

Máš pravdu soudruhu ;D
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: czipis 31. 03. 2021, 17:05:23
Tím získáte čas zapsání souboru na disk, ale to vůbec nevíte, jestli je čas vzniku fotografie. To se ukrývá v exifu.

A vy vite ze ty soubory co tazatel chce zpracovavat maji exif?
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 17:25:56
Tím získáte čas zapsání souboru na disk, ale to vůbec nevíte, jestli je čas vzniku fotografie. To se ukrývá v exifu.

A vy vite ze ty soubory co tazatel chce zpracovavat maji exif?

Ve skutečnosti nevíme vůbec nic. Ani to, kolik souborů je / bude v adresáři po pár dnech. Víme, že každých 15 sekund se tam ukládá obrázek, ale nevíme ani to, jestli a jak je zajištěno, aby to nezačalo (nepokoušelo se) číst ze souboru, který je teprve zapisován atd. atd. atd.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: RDa 31. 03. 2021, 19:37:39
Proc na to jit slozite?
Kód: [Vybrat]
ls -l --sort=timevam da serazeny seznam podle casu, muzete si ho pak rozparsovat (jen doporucuji nastavit nevinne locale natvrdo, napr. LC_ALL=C), a delat to bud s chdir(), nebo v pripade volani skrze system() ci `` a adresarem, to jmeno nezapomenout prohnat pres escapeshellarg().
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Kit 31. 03. 2021, 20:29:42
Kód: [Vybrat]
$files = scandir('directory', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];

Není zač.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 20:35:00
Kód: [Vybrat]
$files = scandir('directory', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];

Není zač.

SCANDIR_SORT_DESCENDING to setřídí podle abecedy.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Kit 31. 03. 2021, 21:30:13
Kód: [Vybrat]
$files = scandir('directory', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];

Není zač.

SCANDIR_SORT_DESCENDING to setřídí podle abecedy.

Hmm, když to zkombinuje s https://www.php.net/filemtime (https://www.php.net/filemtime), tak to bude dělat to, co chce.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 31. 03. 2021, 21:36:44
Kód: [Vybrat]
$files = scandir('directory', SCANDIR_SORT_DESCENDING);
$newest_file = $files[0];

Není zač.

SCANDIR_SORT_DESCENDING to setřídí podle abecedy.

Hmm, když to zkombinuje s https://www.php.net/filemtime (https://www.php.net/filemtime), tak to bude dělat to, co chce.

A pokud  ty soubory neodmazává (což nemáme v zadání vyjasněno), tak mu klekne PHP na timeoutech než se načte adresář, a než to ty statisíce souborů setřídí. Nehledě na počet IO operací. Smyčka v PHP a v ní filemtime je něco, co by mi nahánělo hrůzu, brr.

Pokud není potřeba brát exif ale stačí datum ze souboru (já to nedoporučuju, vím, jak je to ošidné a jak je nesnadné opravdu zajistit, že zůstane neměnné), pak dává smysl použít obyčejné ls.
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Rob Ros 31. 03. 2021, 22:25:02
Nehledě na počet IO operací. Smyčka v PHP a v ní filemtime je něco, co by mi nahánělo hrůzu, brr.

O kolik vice IO operaci je potreba pri zavolani filemtime vs ls?
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Adam Schubert 01. 04. 2021, 00:21:35
To jsou zase "napady"

Predpokladam ze zadani je zobrazeni obrazku na webu dle specifikovaneho data:

Pokud to nejde jinak a musime nutne pracovat se slozkou kde se kazdych 14s vyskytne novy soubor, tak na to samozrejme musime pouzit sluzbu ktera bude danou slozku sledovat na zmeny (inotify) a pri kazdem IN_CREATE eventu provest s danym souborem pozadovanou operaci, v tomto pripade asi INSERT do databaze s nazvem souboru, casem vytvoreni a pripadne dalsi metadata ktere chceme na webu zobrazit nebo je pouzit k hledani...

pak take jednou za cas provest uklid starych dat z DB(pripadne dane slozky) pokud jiz nebudou treba (znovu z dane service, netreba do toho michat cron)

Zde je priklad pouziti pyinotify (python) pro sledovani noveho souboru ve slozce https://stackoverflow.com/questions/33788186/pyinotify-for-watching-new-file-creation-in-a-folder

No a pro onu webovou aplikaci v PHP to pak znamena jen cist data z databaze a mit pristup ke cteni k souborum v sledovane slozce...

PS: Nemam problem tohle^ za uplatu pro tebe pripravit jako systemd service + python3
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Miroslav Šilhavý 01. 04. 2021, 00:23:21
...

+1
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: PanVP 01. 04. 2021, 08:04:03

Aneb jak z naprosto triviální úlohy udělat "zakázečku za deset táců" ;D

+1

Vybagrovat z toho peníze za každou cenu.
A další peníze vybagrovat z toho, že to bude někdo udržovat.
Žádná Win-Win situace, ale pocta bohu Ojebovi.
 ::)
Vymýšlení Českého řešení, improvizované, zato drahé a s nároky na náročnou údržbu.

Když už by to měl někdo dělat správně, tak se postarat, aby výstup z kamery byl správně očíslovaný.
Všechno ostatní jsou jen rovnáky na ohýbák.
Rovnák na ohýbák má smysl jen ve chvíli, kdy to je prostě tak easy, že nemá smysl napravovat problém.

Příklad:
Teče dírou do střechy.
Já navrhuji, když se vám to nechce spravovat, dejte tam kýbl.
Vy navrhujete - dáme tam profesionální odsávačku s detektorem, jak se objeví kapání, odsávačka začne pumpovat a nakonec i pustí lesní vůni.  ::)
Ale problém je, že je díra ve střeše ježkovi woči!
Když vadí díra ve střeše a kýbl nestačí, tak snad opravím tu díru ne?

BTW, dost možná je výstup z kamery i správně očíslovaný, jen je zakódovaný do číselného formátu, který nemusí být na první pohled zjevný. Programátoři je velmi zřídka název generují nesmyslně. Dost možná ani žádná díra ve střeše není. 
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: Adam Schubert 01. 04. 2021, 09:07:26

Aneb jak z naprosto triviální úlohy udělat "zakázečku za deset táců" ;D

+1

Vybagrovat z toho peníze za každou cenu.
A další peníze vybagrovat z toho, že to bude někdo udržovat.
Žádná Win-Win situace, ale pocta bohu Ojebovi.
 ::)
Vymýšlení Českého řešení, improvizované, zato drahé a s nároky na náročnou údržbu.

Když už by to měl někdo dělat správně, tak se postarat, aby výstup z kamery byl správně očíslovaný.
Všechno ostatní jsou jen rovnáky na ohýbák.
Rovnák na ohýbák má smysl jen ve chvíli, kdy to je prostě tak easy, že nemá smysl napravovat problém.

Příklad:
Teče dírou do střechy.
Já navrhuji, když se vám to nechce spravovat, dejte tam kýbl.
Vy navrhujete - dáme tam profesionální odsávačku s detektorem, jak se objeví kapání, odsávačka začne pumpovat a nakonec i pustí lesní vůni.  ::)
Ale problém je, že je díra ve střeše ježkovi woči!
Když vadí díra ve střeše a kýbl nestačí, tak snad opravím tu díru ne?

BTW, dost možná je výstup z kamery i správně očíslovaný, jen je zakódovaný do číselného formátu, který nemusí být na první pohled zjevný. Programátoři je velmi zřídka název generují nesmyslně. Dost možná ani žádná díra ve střeše není.


tohle je prkotina na 2h...

i kdyby se mu povedlo zmenit format ukladani souboru nebo rozklicovat poradi/cas ve stavajcim formatu, nijak mu to nepomuze a stejne to bude muset zpracovat pres inotify eventy... proc? Protoze delat jakekoliv operace nad 6k>
soubory z webove PHP aplikace je nebetycna prasarna.
Hlavne ale predpokladam ze chce nad danymi soubory interaktivne hledat z one PHP aplikace dle data a to bud zadanim casu s presnosti na ?minuty? nebo zadanim rozsahu dvou casu na sekundy (bohuzel dotaz nespecifikuje presne ale jinak si nedokazi predstavit na co by ta PHP aplikace byla uzitecna) no a tyto dve operace lze udelat velmi jednoduse a hlavne rychle nad DB.

Me reseni jsem navrhl s ohledem na to ze dotaz nespecifikuje hromadu dulezitych parametru jako jsou pocet pristupu k dane PHP aplikaci, opravneni k pristupu, atp...

Me reseni je pouzitelne at uz se jedna o PHP aplikaci v intranetu kterou spusti jednou za den (i kdyz by na to stacily tupejsi reseni) a zaroven je pouzitelne i kdyby se jednalo o verejne pristupnou PHP aplikaci s tisici pristupy za hodinu. Protoze nebylo specifikovano jinak, navrhl jsem reseni ktere resi vsechny mozne specificke situace.

PS: Kterej dement programoval tohle forum?! Pri odeslani prispevku me to odhlasilo a zahodilo prispevek (no vlastne nezahodilo, narvalo ho to do input type="hidden" v prihlasovacim formulari bez jakehokliv escapovani/encodovani a rozesralo to HTML formulare, well done! takovy hovna jsem nedelal ani kdyz mi bylo 13 let lol)
Název: Re:PHP výběr obrázku na základě data vytvoření
Přispěvatel: PanVP 01. 04. 2021, 10:14:37
PS: Kterej dement programoval tohle forum?!

No vidíš, místo opravy fóra ti poradím rovnák na ohýbák.
Před odesláním formuláře si text uložíš do schránky, zmáčkneš prohlédnout, pokud to projde, pokusíš se příspěvek vložit.
Také můžeš použít řešení ve tvém stylu, prostě si do prohlížeče přidáš rozšíření, které si bude pamatovat obsahy formulářů a budeš si hlídat jeho funkčnost, aktualizovat a opečovávat.

....a nebo by mohl někdo tohle fórum opravit, ale to by nebylo IT  ;D