Home  PHP Projekte  PHP Schulung  Informationsquellen  Geschichte  Core PHP  Fortgeschrittenes PHP  Templates  Cache-Technologien  Was cachen?  Wo cachen?  Probleme  Ersetzungsstrategien  Aktualität  Speichermedien  Assembly  Lebensretter  Verursacher  Trugschluß  Gegenmaßnahmen  Ergebnis I  Ergebnis II  OOH Forms  Technik der Site  Büchertipps  Fotografie  Airbrush  Kontakt  Stuff 
|
Gegenmaßnahmen
Die Auskommentierung der Grafiken führte zu einer sofortigen
Serverentlastung, was bewies das der Verursacher gefunden war.
Als Gegenmaßnahme wurde ein Code- (APC 1.1.0) und ein
Userland-Cache (PEAR-Cache) eingesetzt.
Zur Beschleunigung wurde die Startseite mit einem
leicht modifizierten PEAR OutputCompression Cache
umgeben. So waren nur wenige Zeile Code einzufügen,
der bestehende Code blieb unverändert.
Alle kritischen image.php Aufrufe werden
in der Methode end() in statische Grafiken gewandelt.
| Lebensretter |
Top |
|
<?php
require_once('Cache/OutputCompression.php');
class Lebensretter extends Cache_OutputCompression {
function end($expire = 0, $userdata = "") {
global $HTTP_HOST;
$content = ob_get_contents();
ob_end_clean();
// die Problemverursacher
if (preg_match_all('@src="(image\.php\?id=(\d+))"@', $content, $matches, PREG_SET_ORDER)) {
// nicht mehr das 63k Skript image.php aufrufen, PHPLib-DB mit 12k benutzen
include_once('db_mysql.inc');
$db = new Db_Sql;
reset($matches);
while (list($k, $match) = each($matches)) {
$query = sprintf('select * from imagebrowser where img_idx = %d',
$match[2]
);
$db->query($query);
$db->Next_Record();
$filename = 'img_' . md5($db->f('imagename'));
// alle Binärdaten ins Dateisystem!
$fp = @fopen('www.example.com/pages/image_cache/' . $filename, 'w');
if (!$fp)
continue;
fwrite($fp, $db->f('image'));
fclose($fp);
// img-Tag verändern, statisches Files benutzen
$content = str_replace($match[1], '/image_cache/' . $filename, $content);
}
}
// store in the cache
if ($this->caching) {
$this->extSave($this->output_id, $content, $userdata, $expire, $this->output_group);
return $this->content;
}
return $content;
} // end func end()
} // end class Lebensretter
?>
|
< ^ >
|