Autor Zpráva
vacjos
Profil *
Ahoj,
1) Potřeboval bych si na stránkách zprovoznit vlastní logy, nechce se mi je totiž u poskytovatele platit.
Hledal jsem na netu a našel jen tento script a trochu si ho poupravil. Nefunguje mi v něm ale získání velikosti souboru ($size) - vždy mi to napíše 0. Nevíte proč a jak to napravit? Skript vkládám do každé z mých stránek vždy na začátek stránky přes <?php include("./logger.php"); ?>

2) Tento dotaz není pro mne zas tak moc důležitý, ale zajímalo by mě to: Můj skript loguje jen php stránky, do kterých je načten. Lze nějak udělat, aby se logovaly všechny soubory. Tedy i js, html, css, obrázky, chybové stránky... prostě vše, tak jak bych to dostal od poskytovatele, kdybych si to zaplatil? Nemám přístup ke konfiguraci apache. Jde to vůbec?

logger.php:
<?php
$logfile = "./log/".date("y").date("n").".log";
if (file_exists($logfile)) {}
else {
  $fp = fopen($logfile,"w");
  fclose($fp);
}
$timezone = "+0200";
$lookup_size = true;
$server_name = get_var( "SERVER_NAME",  "-");
$document_root = "http://$server_name";
function write_to_log($str) {
  if($fd = @fopen($GLOBALS[ "logfile"],  "a")) {
    fputs($fd, $str);
    fclose($fd);
  }
}

function get_var($name,$default) {
  if($var = getenv($name)) {return $var;}
  else {return $default;}
}

$remote_host = get_var( "REMOTE_ADDR",  "-");
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$remote_user = get_var( "REMOTE_USER",  "-");
$remote_ident = get_var( "REMOTE_IDENT",  "-");
$server_port = get_var( "SERVER_PORT", 80);
if ($server_port != 80) {$server_port =  ":" . $server_port;}
else {$server_port =  "";}
$request_method = get_var( "REQUEST_METHOD",  "GET");
$request_uri = get_var( "REQUEST_URI",  "");
$user_agent = get_var( "HTTP_USER_AGENT",  "");
$referer_url = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : "";
if ($lookup_size == true && $document_root) {
  $filename = $request_uri;
  $filename =  "$document_root$filename";
  if (!$size = filesize($filename)) {$size = 0;}
}
else {$size = 0;}
$date = gmdate( "d/M/Y:H:i:s");
$log = "$hostname $remote_host $remote_ident $remote_user [$date $timezone] \""."$request_method http://$server_name$server_port$request_uri\"; 200 $size \"$referer_url\" \"$user_agent\"\n";
write_to_log($log);
?>
Keeehi
Profil
Řádek 36 je zbytečný. Ta podmínka na řádku 38 se mi moc nepozdává. Co tam bylo původně? Projde vůbec script přes podmínku na řádku 35?
vacjos
Profil *
Zde je originál:
Odkaz
vacjos
Profil *
Záznam chybové stránky 404 jsem již provedl pře .htaccess vložením: ErrorDocument 404 /404notfound.php
a do stránky 404notfound.php jsem includoval můj logger.php s modifikací 200 na 404. Lze nějak zaznamenávat i jiné?
vacjos
Profil *
Nevíte někdo jak zjistit velikost stahované stránky?
imploder
Profil
vacjos:
Nevíte někdo jak zjistit velikost stahované stránky?
To nejde dokud není celá vytvořená. Musíš teda nejdřív vytvořit stránku, a až potom se dá zjistit, jak je velká.

Dá se to udělat tak, že zavoláním ob_start (BTW ten warning tam se tvojeho skriptu asi zrovna týká) zapneš zápis do bufferu, ...normálně echuješ (nebude se to zapisovat na výstup rovnou, ale do bufferu)..., a až bude všechno hotové, tak zjistíš ob_get_length délku bufferu a ob_end_flush buffer vyprázdníš a vypneš (tím se všechno vypíše). Jde to dělat i po kouskách tak, že se délky jednotlivých kousků budou sčítat - to by ale zaneřáďovalo stránku, nedalo by se to dělat na jednom místě, takže lepší bude to udělat zapnutím bufferu úplně na začátku a zjištěním délky a vypnutím bufferu úplně na konci.

Pokud má být zalogovaný každý přístup a logovat se bude až na konci provádění skriptu, je potřeba zapnout ignore_user_abort. Jinak by se nic nezalogovalo, pokud by během provádění skriptu uživatel zmáčkl tlačítko Zastavit (nebo <Esc>) a tím odpojil prohlížeč od serveru - skript by se tím zastavil.
vacjos
Profil *
Bezva:-)

A lze to nějak poupravit, aby to ukázalo nejen velikost zobrazené stránky (=textů ve zdrojáku) ale současně i velikost připojených souborů ke stránce (css,obrázků,js,..), které se načítají se stránkou?

Díky
imploder
Profil
vacjos:
A lze to nějak poupravit, aby to ukázalo nejen velikost zobrazené stránky (=textů ve zdrojáku) ale současně i velikost připojených souborů ke stránce (css,obrázků,js,..), které se načítají se stránkou?
Připojené soubory se načítají z prohlížeče až po načtení stránky, na každý se vytváří samostatný HTTP požadavek. Něco z toho se nemusí načíst, např. když jsou v prohlížeči vypnuté obrázky, styly, JS, atd.. Takže velikost nejde přímo ve stránce spolehlivě spočítat.

Je možnost, jak to řešit: načítat každý soubor PHP skriptem. Místo URL vedoucí přímo na soubor se použije URL skriptu, např.:
<img src="obrazek.php?s=1">

Skript vypíše obrázek na výstup a zaloguje přitom údaje a velikost stejně jako u stránky (velikost může zjistit pomocí filesize() - tady je to jednodušší). Ukázka:

/* skript obrazek.php */

// toto jsou soubory, které můžeme načíst 
$soubory = array(
1 => 'obr1.jpg',
2 => 'obr2.jpg',
3 => 'nejaka-fotka.jpg'
);

// vybereme soubor podle parametru s
if (isset($_GET['s']) && isset($soubory[$_GET['s']]))
  $s = $soubory[$_GET['s']];
else
  die(); 

// zalogujeme přístup (velikost zjistíme filesize($s))
zaloguj($s);

// vypíšeme soubor na výstup
header('Content-Type: image/jpeg'); // HTTP hlavička Content-Type - musí odpovídat typu souboru
echo file_get_contents($s);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0