Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Nokiacek 24. 02. 2014, 09:58:20

Název: PHP skript: ověření existence obrázku
Přispěvatel: Nokiacek 24. 02. 2014, 09:58:20
Dobry den.

Potreboval by som poradit. Mam databazu v nej v premennej obrazok.
Ako napisat v php script tak aby overoval ci existuje dany obrazok ?
Nieako som sa zasekol a neviem si dobre predstavit ako to napisat.
Dakujem
Název: Re:PHP script ako overit
Přispěvatel: DK 24. 02. 2014, 10:10:25
obrazek je lokalne? http://cz2.php.net/file_exists
pokud je to url, tak file_get_contents, nebo pouzit curl, nicmene tohle bude dost pomale
Název: Re:PHP script ako overit
Přispěvatel: Karel 24. 02. 2014, 10:52:06
Uplne neni rozumet tvemu problemu.
Název: Re:PHP script ako overit
Přispěvatel: Nokiacek 24. 02. 2014, 11:35:23
obrazok je niekde na webe.
V databaze je www.xxx.xy/obrazok.png a neviem si poradik ako ho overit ci existuje alebo nie.
Název: Re:PHP script ako overit
Přispěvatel: DK 24. 02. 2014, 11:57:07
tak pomoci curl zkontrolovat hlavicku serveru (status code a content-type), nicmene zde vznika problem, protoze server muze odpovidat i nekolik sekund, takze to spis do nejakeho extra jobu
Název: Re:PHP script ako overit
Přispěvatel: tonda_ 24. 02. 2014, 12:09:54
php ma funkci, nepotrebujes curl/wget - ale jak rika DK muze to chvilku trvat
http://us2.php.net/manual/en/function.fopen.php

<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
Název: Re:PHP script ako overit
Přispěvatel: Nokiacek 24. 02. 2014, 12:39:31
no to je ten problem v db je cca 10.000 + zaznamov a viac krat do dna sa menia. Ja potrebujem overit ci dany obrazok existuje ak nie drop udaj. problem je prave v tom ze neviem ako to efektivne okodovat ci tam obrazok je a co nie...
Název: Re:PHP script ako overit
Přispěvatel: DK 24. 02. 2014, 12:51:08
tonda_: tady by dle me mohl nastat problem kdy dany soubor vrati obsah, ale bude to treba stranka, neco nejaka hlaska

Nokiacek: no pokud to nepotrebujes realtime, tak to spust v cronu/cli, bude to trvat dlouho, ale nebude to zpomalovat web (a pokud nemas vlastni server, tak tam bude i problem s max_execution_time
Název: Re:PHP script ako overit
Přispěvatel: Nokiacek 24. 02. 2014, 12:55:38
No a nebolo by lepsie cakat na to co vrati server ?

Napriklad takto ?
$filePath = "http://www.xyz.xz/xxx.png"
if ((is_file($filePath)) && (file_exists($filePath))) {
    return true;
}
else {
    return false;
}

rozmyslam ze to hodim do cronu a bude kazdych 5 minut kontrolovat DB. Ale nezda sa mi to efektivne..
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: DK 24. 02. 2014, 13:08:09
Nokiacek: podle mych zkusenosti tohle nebude vubec fungovat presne... na tohle by slo pouzit http://cz1.php.net/get_headers (ani jsem nevedel, ze takova funkce je), misto file_exists, protoze budes moct zkontrolovat, jestli to je fakt obrazek, nebo jenom nejaka chybova hlaska

nejlepsi je dle me porad curl, muzes tam nastavit timeout a tim vyradit obrazky, ktere sice budou existovat,b ale nacitat se budou pomalu

pokud to potrebujes pravidelne, asi by bylo nejlepsi vytvorit si index proscanovanych souboru (treba zaznamenat jenom posledni ID, pokud tam mas autoincrement) a v cronu to pak poustet jenom pro nenaindexovane soubory... do toho treba v nekdy noci kontrola vsech obrazku, jestli stale existuji, ale pri velkem poctu to muze byt celkem problem



nicmene, pokud nejde o verejny web (tj pristupuje k nemu jenom mala skupina lidi), je mozne udelat tu kontrolu synchronne pri kazdem nacteni obrazku, sice by to bylo pomalejsi, ale zase by to bylo presne


no a posledni moznost je to resit na strane klienta -> nulova rezie ze strany serveru, pres ajax pozadavek na smazani souboru, ale zase ti nejaky klient muze smazat celou databazi/zahltit server (pri kombinaci obojiho -> pokud se klientovi obrazek nenacte, ajax pozadavek, ktery zkontroluje, zda obrazek vazne neexistuje) :)
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: to_je_jedno 24. 02. 2014, 13:22:44
- do cronu urcite, idealne to poustet pres CLI
- nekam si zapisuj last checked id. nebo si pri kazdem check aktualizuj timestamp zaznamu v DB. kazde muze mit vyhody i nevyhody.
- checkuj jen hlavicky (co kdyz bude kazda fotka 5MB?)
Název: Re:PHP script ako overit
Přispěvatel: tonda_ 24. 02. 2014, 13:41:48
tonda_: tady by dle me mohl nastat problem kdy dany soubor vrati obsah, ale bude to treba stranka, neco nejaka hlaska

Nokiacek: no pokud to nepotrebujes realtime, tak to spust v cronu/cli, bude to trvat dlouho, ale nebude to zpomalovat web (a pokud nemas vlastni server, tak tam bude i problem s max_execution_time

co rikas je samozrejme dobre ;-)
mozna tedy toto http://us3.php.net/get_headers
ale zase jsem videl ze nekdo ma stranku a generuje dynamicke obrazky a muze vygenerovat obrazek a hlavicky a ten obrazek bude prazdny.


takze bude neljepsi si definovat co budes acceptovat za OK and co za FAIL a napsat mozna kombinaci obojeho..
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: Nokiacek 24. 02. 2014, 14:49:39
Takze viac do obrazu.
Jeden script pridava - upravuje uz existujuce zaznamy. Teda ak ma klient upravu / zmeneny parameter zasle len na server poziadavku a ten spracuje jeho feed. Raz moze pridat xy poloziek alebo moze niektore odmazat / zmenit parameter. Toto sa deje aktualne asi 5x do dna ale pocita sa s cca 100 - 200 x do dna. potom je dalsia skupina ktora sice nic neneni ale nikde nie je napisane ze ten jeho obrazok medzi casom nezmeni stav na 404. Preto potrebujem prechadzat DB a taketo zaznamy bez obrazka dropovat. DB resp. jej index sa upravuje . Ide mi o to ako najlepsie porovnam ci dany obrazok existuje a musim kontrolovat uz aj existujuce obrazky ci este stale existuju.

 Stale sa bavime o php.k dispozicii je este CRON a limita  namax_execution_time je len 60s. Tahat obrazky k sebe na server porovnat ci to je obrazok a s5 mi nepride velmi efektivna. Ma s tym niekto skusenost ako to efektivne "skenovat" a upravovat?
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: DK 24. 02. 2014, 14:57:17
nemusis obrazky tahat, jenom zjistovat http hlavicku... pokud je status code 200 a content-type je obrazek, tak by to melo byt ok
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: meno 24. 02. 2014, 15:28:27
Nokiacek: podle mych zkusenosti tohle nebude vubec fungovat presne... na tohle by slo pouzit http://cz1.php.net/get_headers (ani jsem nevedel, ze takova funkce je), misto file_exists, protoze budes moct zkontrolovat, jestli to je fakt obrazek, nebo jenom nejaka chybova hlaska

Preco by nemalo is_file fungovat presne?
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: DK 24. 02. 2014, 17:27:31
Nokiacek: podle mych zkusenosti tohle nebude vubec fungovat presne... na tohle by slo pouzit http://cz1.php.net/get_headers (ani jsem nevedel, ze takova funkce je), misto file_exists, protoze budes moct zkontrolovat, jestli to je fakt obrazek, nebo jenom nejaka chybova hlaska

Preco by nemalo is_file fungovat presne?

protoze se jedna o url... is_file sice podporuje wrappery (takze i http), nicmene z mych zkusenosti to nefunguje vzdy korektne (ani file_get_contents)... mojim zbeznym testem to oznacilo vsechny vzdalene soubory jako neplatne (s priponou, bez pripony, se spravnym content-type, s neznamym content-type, iso, txt, php), prestoze se o soubory jedna
navic co kdyz pujde o https? bude muset vsechny odkazy kontrolovat a navic to stejne nemusi fungovat korektne (a pokud neni web dostupny, muze to klidne haltnout workera na celych 60 sekund), curl je v tomhle mnohem flexibilnejsi
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: LV codet 28. 02. 2014, 14:55:02
Vyriesil som to nasledovne
<?php

Kód: [Vybrat]
include("dtb.php");
$result = mysql_query("SELECT * FROM produkt");

while($row = mysql_fetch_array($result))
  {
  $idproduktu=$row['ID'];
  $imgurl=$row['IMGURL'];
 
if(@GetImageSize($imgurl)){
    echo("All is OK");
}else{
   mysql_query('DELETE FROM produkt WHERE ID="'.$idproduktu.'"');
   $delete++;
}
}     
 
echo $delete;
?>

avsak je to pomale. Existuje moznost ako tento script spustat tak aby sa "davkoval"? Spravuje dajme tomu 1000 udajov a zase 1000 atd atd ? Ide mi o to aby nezacinal stale od znova. Identifikator ci to bolo skontrolovane alebo nie nemozem pouzit lebo data sa velmi rychlo menia

Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: cik951 28. 02. 2014, 17:36:37
avsak je to pomale. Existuje moznost ako tento script spustat tak aby sa "davkoval"? Spravuje dajme tomu 1000 udajov a zase 1000 atd atd ? Ide mi o to aby nezacinal stale od znova. Identifikator ci to bolo skontrolovane alebo nie nemozem pouzit lebo data sa velmi rychlo menia
Mě na těhle dotazech nejvíc fascinuje, že jsou většinou tak obecně formulované a doplňující informace se objevují až časem, že přemýšlím nad tím, jestli ten zadavatel pracuje na nějakém tajném vladním projektu, nebo našel nějakou velice lukrativní skulinu v nabídce softwarových služeb a nechce o tom moc psát, aby jej někdo nepředběhl :P

Pořád, abych pravdu řekl, tak tomu ne až tak úplně rozumím. Můžete napsat, jaké varianty mohou nastat ( tím myslím obsah databáze a existence / neexistence / aktuálnost daného obrázku ) a seřadit je podle toho, jak velký problém daná situace znamená?
Nepomohla by lokální cache obrázků ? Co když dojde k výpadku internetu ( nebo jen např dočasná nedostupnost dns ) a bude probíhat ten váš skrip, tak nejspíš smaže všechna data ve vaší databázi, když pak se obnoví spojení, jak velký problém bude to, že je vaše databáze prázdná (nejpíš bude trvat nějaký čas než se obnoví ) ? Jedná se o placenou službu s garancí ? atd.

Co se týče zpracování po 1000 kusech ... nepomohlo by ukládat do daného řádku timestamp poslední kontroly existence obrázku a pak zpracovávat 1000 řádků ( limit 1000 )  seřazaných podle timestampu ?
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: LV codet 28. 02. 2014, 17:55:35
cik951 : no ono rozoberat cely system ako to funguje je offtopic. Ale v skratke xy krat denne aktualizujeme feedy vo feedoch su linky na externe obrazky. Denne okolo 50 - 100t produktov a rata sa s mega denne. Druhy script kontroluje kazdu pol hodinu DB a odmazava polozky ktore nemaju obrazok. Casto sa menia pozicie v DB feedy su skoro vzdy ine. Ulohou bolo kontolovat ci existuje obrazok a ked nie odmazat cely udaj prec. Problem je ten ze script moze bezat maximalne 60 sekund. Nenapadlo ma ako ho davkovat tak aby si nacital napriklad len 5000udajov a pokracoval tam kde skoncil. Neviem to povedat viac po lopate. Ci obrazok existuje som vyriesil tak ze overujem jeho velkost. Ak nie je velkost tak nie je obrazok.file_get mi nerobilo dobrotu
Název: Re:PHP skript: ověření existence obrázku
Přispěvatel: to_je_jedno 28. 02. 2014, 19:48:28
chytrymu napovez, blbyho kopni kanadou do držky!!!