Es werden in 4images einige Dateien als "Download als Zip" angeboten.
Der Code wiederum, der diese Zips produziert ist ziemlich "in-effizient".
Durch komplettes in-memory speichern der Daten als auch durch etliche unnötige string-Operationen mit den Datei-Inhalten
(etwa implodes, oder nested substr)
wird der Speicherbedarf des scripts unnötig in die Höhe getrieben.
So ist es ein leichtes, das etwa ein Lighbox-Zip ein memory_limit (von bei uns 32MB) bricht.
Das es nicht nur uns so geht beweist etwa folgender thread:
http://www.4homepages.de/forum/index.php?topic=6848.0Ich habe uns eine replacement-class gebaut, die wir statt der includes/zip.php mit Erfolg einsetzen.
Diese ist hier zu finden:
http://celebnamer.celebworld.ws/sources/zipfile.class4.phpsAnmerkungen zu dieser Klasse:
- Weniger Speicherbedarf durch Benutzung eines Standard tempfile() bei den Daten.
- Weniger string-Operationen
- Besseres free'en der Resourcen (unset()en)
- (orginal classe ist php5, diese ist "portiert")
Ferner bedarf es Änderungen in der download.php
In unserem Fall sehen diese (für action=lightbox) so aus (unkommentiert):
if ($action == "lightbox") {
if (empty($user_info['lightbox_image_ids']) || !function_exists("gzcompress") || !function_exists("crc32")) {
header("Location: ".$site_sess->url($url, "&"));
exit;
}
$image_id_sql = str_replace(" ", ", ", trim($user_info['lightbox_image_ids']));
$image_ids = array();
$sql = "SELECT image_id, cat_id, image_media_file, image_download_url
FROM ".IMAGES_TABLE."
WHERE image_active = 1 AND image_id IN ($image_id_sql) AND cat_id NOT IN (".get_auth_cat_sql("auth_download", "NOTIN").")";
$result = $site_db->query($sql);
if ($result)
{
@set_time_limit(120);
include(ROOT_PATH."includes/zip2.php");
$file = sprintf('lightbox_%s.zip', gmdate('Ymd-His'));
$zipfile = new ZipFile($file);
$file_added = 0;
while ($image_row = $site_db->fetch_array($result))
{
if (!empty($image_row['image_download_url']))
{
if (is_remote_file($image_row['image_download_url']) || is_local_file($image_row['image_download_url']))
{
$file_path = $image_row['image_download_url'];
}
}
else if (is_remote($image_row['image_media_file']));
else
{
$file_path = MEDIA_PATH."/".$image_row['cat_id']."/".$image_row['image_media_file'];
}
if (!empty($file_path) && is_file($file_path) && is_readable($file_path))
{
$zipfile->addFile($file_path);
$file_added = true;
$image_ids[] = $image_row['image_id'];
}
}
if ($file_added)
{
if ($user_info['user_level'] != ADMIN)
{
$sql = "UPDATE ".IMAGES_TABLE."
SET image_downloads = image_downloads + 1
WHERE image_id IN (".trim(implode(", ", $image_ids)).")";
$site_db->query($sql);
}
$zipfile->send();
exit;
}
else {
header("Location: ".$site_sess->url($url, "&"));
exit;
}
}
}Wenn er die Klasse aufnehmen, oder teilweise nutzen wolt nur zu -> BSD-Style license
PS:
Wer bugs findet darf sie behalten