Autor Zpráva
Karel Vácha
Profil *
Brý večer,

objevil jsem, že se zde používá asi PHP ke generování symbolů jednotlivých kategorií u každého moderátora. Tady zde Moderování na diskusi JPW

Chtěl jsem se zeptat, proč tomu tak jest, a jestli by nebylo možno tento skript zobrazit ke stažení. Docela by se mi hodil k mému generování hodností v jedné hře. Stáhl jsem si miniBB, ale soubor se tam nenachází, asi tedy vlastní modifikace.

Uctivě děkuji

--
KV
Alphard
Profil
Nejsem autorem scriptu, takže ho zveřejňovat nemohu, ale není to nic jiného než imagecopy(). V manuálu je kompletní příklad včetně imagecreatetruecolor(), stačí seskládat ikonky.
Karel Vácha
Profil *
Alphard:
Dobře děkuji. Mohu se zeptat proč se to dělá tímto způsobem? A jsou tam nějaké další věci atypické? Např. nějaké kešování, aby obrázek se stále pro prohlížeč negeneroval znovu? Kdo je autorem?

Děkuji i tak

--
KV
Keeehi
Profil
Karel Vácha:
Řekl bych, že je to proto aby si to ty údaje mohlo brát z databáze.
Karel Vácha
Profil *
Keeehi:
To asi ano. Nicméně se mi zdá, že ten skript není k serveru nejšetrnější, musí si "osahat" cca 30 ikonek a ty poté navkládat do 1 a vypustit ven.

Jen tak jsem na to narazil a zajímalo jak a proč je to udělané.

Zkusím si to napsat.

Děkuji

--
KV
Alphard
Profil
Jak jinak by se to mělo dělat? Je to takhle nejjednodušší. Cachování tam je, autorem je zřejmě Str4wberry, nevím jistě.

Nicméně se mi zdá, že ten skript není k serveru nejšetrnější, musí si "osahat" cca 30 ikonek a ty poté navkládat do 1 a vypustit ven
Vzhledem k použitému cachování je tato zátěž směšná. Zřejmě nemáte tušení, kolik souborů vygeneruje např. Nette u většího projektu po smazání cache, a musí při tom projít všechny scanované adresáře.
Keeehi
Profil
Karel Vácha:
Mohl by jsi tedy uvést příklad šetrnějšího přístupu?
Karel Vácha
Profil *
Alphard:

Už jsem si to napsal. Mohl bych alespoň poprosit o ten kus kódu s kešováním?
add netuším - Nette neznám, ale dokáži si to představit :}


Jinak stačí tento kód, ale to kešování netuším jak tam docvaknout.
$src = imagecreatefromgif('ad.gif');
$src2 = imagecreatefromgif('af.gif');
$src3 = imagecreatefromgif('ae.gif');
$dest = imagecreatetruecolor(3 * 16 + 300, 11);

$red = imagecolorallocate($dest, 255, 255, 255);
imagefill($dest, 0, 0, $red);

// Copy
imagecopy($dest, $src, 0, 0, 0, 0, 16, 11);
imagecopy($dest, $src2, 26, 0, 0, 0, 16, 11);
imagecopy($dest, $src3, 52, 0, 0, 0, 16, 11);

// Output and free from memory
header('Content-Type: image/jpg');
imagejpeg($dest);

--
KV


Keeehi:
No pokud se tam šikovně zakomponují hlavičky, aby se ten soubor surově neustále negeneroval znovu, tak by to mohlo být ono. Nicméně můj chrome mi neustále vrací k modicons.php 200/OK a ne 301 not modified, tak nevím, jestli to máte zakešováno dobře. Sám nevím jak, s hlavičkami si moc netykám.

--
KV


Oprava, ne 301 ale 304 samozřejmě :}

--
KV
mimochodec
Profil
Karel Vácha:

Není potřeba obrázek generovat vždy, stačí to udělat při změně práv dané osoby.
A není potřeba každý příspěvek podepisovat KV.
Karel Vácha
Profil *
mimochodec:
Není potřeba obrázek generovat vždy, stačí to udělat při změně práv dané osoby

A jak to mám provést v kódu, který jsem pastnul? Chci aby poprvé generoval 200 a pak aby se zakešoval 304.
mimochodec
Profil
Karel Vácha:
A jak to mám provést v kódu, který jsem pastnul?

Já tyhle funkce běžně nepoužívám, tak nevím, jestli to je správně. Ale chtěl jsem tím říct, že bych ten výstup nezobrazil, ale uložil jako obrázek. Toto bych provedl jednorázově pro všechny osoby a pak při každé změně pro danou osobu.
Alphard
Profil
Karel Vácha:
Zdejší cachování je trochu jiné kvůli specifickým podmínkám.
Běžný postup by byl generovat obrázky pojmenované např s id uživatele, např. profil_57.gif. Tento obrázek by se přegeneroval vždy při změně oprávnění uživatele a odkazovalo by se na něj klasicky <img src="profil_57.gif">.
Chamurappi
Profil
Reaguji na Alpharda:
Cachování tam je, autorem je zřejmě Str4wberry, nevím jistě.
Nejsem si tím úplně jistý, ale myslím, že jsem ten skript improvizovaně spatlal já, protože celá ta stránka o moderování byla moje iniciativa. Tuším, že jsem se inspiroval nějakým jiným skriptem na sestavování sprite obrázků, který dělal Str4wberry… už si přesně nevzpomínám.


Reaguji na Karela Váchu:
jak a proč je to udělané
Aby každý návštěvník té stránky nemusel tahat odděleně všech 30 ikonek a aby se všechno dalo snadno automaticky přegenerovat z jednoho zdroje dat.

mi neustále vrací k modicons.php 200/OK a ne 304 not modified, tak nevím, jestli to máte zakešováno dobře
Kešuje se celý vygenerovaný obrázek do souboru. PHP se na začátku koukne, jestli existuje — pokud ano, vrátí jeho obsah, pokud ne, vygeneruje se nový a ten se vrátí klientovi i uloží do souboru.
Karel Vácha
Profil *
Chamurappi:
Děkuji za vysvětlení. Stejně si myslím, že tam máte chybku, protože mi to nikdy nevrátí hlavičku 304.

Alphard:
Takže postup by měl být takový, vygenerovaní do souboru a poté jeho načtení např. přes readfile s patričnými hlavičkami?
A jinak platí to co jsem napsal výše, stále to vrací 200vku (nejnovější Chrome) takže si myslím, že to není dobře. Ještě zapátrám, je s tím celkem problém.

Každopádně díky všem za užitečný topic a rady.
Davex
Profil
Karel Vácha:
Stejně si myslím, že tam máte chybku, protože mi to nikdy nevrátí hlavičku 304.
Domnívám se, že to není chyba, ale vlastnost a tento skript neumí zpracovat podmíněné HTTP požadavky. Ono to ani ničemu nevadí, protože se výsledný obrázek kešuje na serveru a rok v prohlížeči. Výsledný vliv na výkon je nula celá nula nic.
Karel Vácha
Profil *
Davex:
No já si to nemyslím, ale je to možné už kvůli tvrzení protože se výsledný obrázek kešuje na serveru a rok v prohlížeči

Mohu vědět jak na to? (konkretní kód)

PS. Jinak jsem ted našel kód, který korektně vrací 304 po druhém a dalším načtení, kdyby to někoho zajímalo.




    
    // Return the requested graphic file to the browser
// or a 304 code to use the cached browser copy
function displayGraphicFile ($graphicFileName, $fileType='jpeg') {
  $fileModTime = filemtime($graphicFileName);
  // Getting headers sent by the client.
  $headers = getRequestHeaders();
  // Checking if the client is validating his cache and if it is current.
  if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $fileModTime)) {

    // Client's cache IS current, so we just respond '304 Not Modified'.
    header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fileModTime).' GMT', true, 304);
  } else {
    
    // Image not cached or cache outdated, we respond '200 OK' and output the image.
    header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fileModTime).' GMT', true, 200);
    header('Content-type: image/'.$fileType);
    header('Content-transfer-encoding: binary');
    header('Content-length: '.filesize($graphicFileName));
    readfile($graphicFileName);
  }
}


// return the browser request header
// use built in apache ftn when PHP built as module,
// or query $_SERVER when cgi
function getRequestHeaders() {
  if (function_exists("apache_request_headers")) {
    if($headers = apache_request_headers()) {
      return $headers;

    }
  }
  $headers = array();
  // Grab the IF_MODIFIED_SINCE header
  if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    $headers['If-Modified-Since'] = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
  }
  return $headers;
}
Davex
Profil
Karel Vácha:
Mohu vědět jak na to?
Posílat hlavičku Expires a Cache-Control.

$expires = 365*24*60*60;
header("Expires: " . gmdate("D, d M Y H:i:s \G\M\T", $_SERVER["REQUEST_TIME"] + $expires));
header("Cache-Control: public, max-age=$expires");

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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