Frisst PHP meinen Web Server Speicherplatz?
Yina
- php
Hallo,
ich benutze einen PHP Script, der ein einziges Bild in verschiedene Versionen automatisch verkleinert. Allerdings frage ich mich schon die ganze Zeit, wo denn das Script meine temporären verkleinerten Bilder speichert, wenn sie überhaupt irgendwo noch verkleinert vorhanden sind und nicht überschrieben werden.
Denn irgendwie ist mein Server, seitdem ist das Script benutze, dauernd voll, obwohl ich jetzt schon ziemlich viel gelöscht habe.
Und noch eine Frage: Verbraucht das Erstellen von Ordnern auch Speicherplatz?
Vielen Dank!
Yina
Na du bist ja gut.
Wie soll man wissen, was du genau meinst.
Ein paar Zeilen Code wären schon hilfreich, schon alleine um sicherzugehen, dass bei dir keine Endlosschleife ihr
Unwesen treibt, das wäre nämlich meine erste Vermutung.
Und,..
Ja sicher "...Verbraucht das Erstellen von Ordnern auch Speicherplatz.."
Aber meinst du wirklich Speicherplatz oder Arbeitsspeicher?
Sofie
Hier ist der PHP code:
<?php
include_once("../../thumbnail.php");
$thumbnail = new thumbnail();
$thumbnail->create("1600.jpg");
$thumbnail->setQuality(97);
$thumbnail->resize(800);
$thumbnail->output();
?>
für das Erstellen der verkleinerten Bilder.
Und das ist der Code für die Klasse:
<?php
class thumbnail
{
var $img;
var $fileInfo;
var $fullName;
var $newX;
var $newY;
var $quality;
var $orgX;
var $orgY;
// $data - (voller) Dateiname oder String (z.B. aus Datenbank)
function create($data)
{
$this->destroy();
if (file_exists($data)) {
$this->img = @ImageCreateFromJpeg($data);
$this->fileInfo = basename($data);
$this->fullName = $data;
} else {
$this->img = @ImageCreateFromString($data);
}
if (!$this->img) {
$this->destroy();
return false;
} else {
$this->orgX = ImageSX($this->img);
$this->orgY = ImageSY($this->img);
return true;
}
}
// Höhe des aktuellen Bildes im Container zurückgeben, false bei Fehler
function height()
{
if ($this->img) {
return ImageSY($this->img);
} else {
return false;
}
}
// Breite des aktuellen Bildes im Container zurückgeben, false bei Fehler
function width()
{
if ($this->img) {
return ImageSX($this->img);
} else {
return false;
}
}
// Qualität für Ausgabe setzen
function setQuality($quality = false)
{
if ($this->img && $quality) {
$this->quality = $quality;
} else {
return false;
}
}
// Thumbnail erzeugen
function resize($newX = false,$newY = false)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
$newX = $this->_convert($newX,$X);
$newY = $this->_convert($newY,$Y);
if (!$newX && !$newY) {
$newX = $X;
$newY = $Y;
}
if (!$newX) {
$newX = round($X / ($Y / $newY));
}
if (!$newY) {
$newY = round($Y / ( $X / $newX));
}
if ( ! $newimg = ImageCreateTruecolor($newX,$newY)) {
$newimg = ImageCreate($newX,$newY);
}
if ( ! ImageCopyResampled ($newimg, $this->img, 0, 0, 0, 0, $newX, $newY,$X,$Y)) {
ImageCopyResized ($newimg, $this->img, 0, 0, 0, 0, $newX, $newY,$X,$Y);
}
$this->img = $newimg;
return true;
} else {
return false;
}
}
// Schneidet ein Bild neu zu
/* Werte für cut (X stellt das Ergebnis dar)
$srcX
+---+--------------+
$srcY | | |
+---+---+ |
| | X | $newY | Ursprungsbild
| +---+ |
| $newX |
| |
+------------------+
*/
function cut($newX,$newY,$srcX = 0,$srcY = 0)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
$newX = $this->_convert($newX,$X);
$newY = $this->_convert($newY,$Y);
if (!$newX) {
$newX = $X;
}
if (!$newY) {
$newY = $Y;
}
if ( ! $newimg = ImageCreateTruecolor($X,$Y)) {
$newimg = ImageCreate($X,$Y);
}
ImageCopy ($newimg,$this->img,0, 0, 0, 0,$X,$Y);
ImageDestroy($this->img);
if ( ! $this->img = ImageCreateTruecolor($newX, $newY)) {
$this->img = ImageCreate($newX, $newY);
}
imagecopy ($this->img,$newimg, 0, 0,$srcX, $srcY, $newX, $newY);
ImageDestroy($newimg);
return true;
} else {
return false;
}
}
/* schneidet ein Teil mit Größe newX und newY an festgelegten Stellen des Bildes zu
$pos = Position welches Teil verwendet werden soll
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+
*/
function autocut($newX,$newY,$pos = 5)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
$newX = $this->_convert($newX,$X);
$newY = $this->_convert($newY,$Y);
if (!$newX) {
$newX = $X;
}
if (!$newY) {
$newY = $Y;
}
switch ($pos) {
case 1:
$srcX = 0;
$srcY = 0;
break;
case 2:
$srcX = round(($X / 2)-($newX/2));
$srcY = 0;
break;
case 3:
$srcX = ImageSX($this->img) - $newX;
$srcY = 0;
break;
case 4:
$srcX = 0;
$srcY = round(($Y / 2)-($newY/2));
break;
case 5:
$srcX = round(($X / 2)-($newX/2));
$srcY = round(($Y / 2)-($newY/2));
break;
case 6:
$srcX = $X-$newX;
$srcY = round(($Y / 2)-($newY/2));
break;
case 7:
$srcX = 0;
$srcY = $Y - $newY;
break;
case 8:
$srcX = round(($X / 2)-($newX/2));
$srcY = $Y-$newY;
break;
case 9:
$srcX = $X- $newX;
$srcY = $Y - $newY;
break;
default:
$srcX = round(($X / 2)-($newX/2));
$srcY = round(($Y / 2)-($newY/2));
}
return $this->cut($newX,$newY,$srcX,$srcY);
} else {
return false;
}
}
// erzeugt ein Quadrat des Bildes mit Kantenlänge von $size
// ist das Bild nicht quadratisch kann mit $pos
// der Bildausschnitt festgelegt werden, Werte siehe function autocut
function cube($size,$pos = 5)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
if ($X > $Y)
{
$newX = false;
$newY = $size;
} elseif ($X < $Y) {
$newX = $size;
$newY = false;
} else {
$newX = $size;
$newY = $size;
}
if ($this->resize($newX,$newY)) {
return $this->autocut($size,$size,$pos);
} else {
return false;
}
} else {
return false;
}
}
// erzeugt ein Bild dessen größte Kantenlänge $size ist
function maxSize($size)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
if ($X > $Y)
{
$newX = $size;
$newY = false;
} elseif ($X < $Y) {
$newX = false;
$newY = $size;
} else {
$newX = $size;
$newY = $size;
}
return $this->resize($newX,$newY);
} else {
return false;
}
}
// erzeugt ein Bild dessen kleinste Kantenlänge $size ist
function minSize($size)
{
if ($this->img) {
$X = ImageSX($this->img);
$Y = ImageSY($this->img);
if ($X > $Y)
{
$newX = false;
$newY = $size;
} elseif ($X < $Y) {
$newX = $size;
$newY = false;
} else {
$newX = $size;
$newY = $size;
}
return $this->resize($newX,$newY);
} else {
return false;
}
}
// speichert das Bild als $fileName
// wird $filename angegeben muss es ein voller Dateiname mit Pfad sein
// ist $override wahr wird ein bestehendes Bild überschrieben, sonst nicht
// Rückgabe:
// true wenn geschrieben (oder überschrieben)
// false on error
// 0 wenn schon existiert (nur bei $override=false)
function save($fileName, $override = true)
{
if ($this->img) {
if (!file_exists($fileName) || $override) {
if (ImageJPEG($this->img,$fileName,$this->quality)) {
return true;
} else {
return false;
}
} else {
return 0;
}
} else {
return false;
}
}
// Gibt Bild an Browser aus (Ausgabe des Headers, Destroy aufrufen), beide optional
function output($sendHeader = true,$destroy = true)
{
if ($this->img) {
if ($sendHeader) {
header("Content-type: image/jpeg");
}
ImageJPEG($this->img,"",$this->quality);
if ($destroy) {
$this->destroy();
}
} else {
return false;
}
}
// Setzt die Werte in der Klasse frei und löscht Bild
function destroy()
{
if ($this->img) {
ImageDestroy($this->img);
}
$this->img = false;
$this->fileInfo = false;
$this->fullName = false;
$this->newX = false;
$this->newY = false;
$this->quality = 70;
$this->orgX = false;
$this->orgY = false;
}
// rechnet prozentuale Angaben in Pixel um, erwartet
// ist $value eine Prozentangabe $full als 100% in Pixel angegeben werden
function _convert($value,$full = false)
{
if (strstr($value,"%")) {
$value = trim(str_replace ("%", "", $value));
$value = ($full / 100) * $value;
}
if ($value < 1 && $value !== false) {
$value = 1;
}
return $value;
}
}
?>
Was meinst du mit Endlosschleife?
Übrigens meine ich mit dem "Erstellen von Ordnern" nicht auf dem PC sondern auf dem Web Server, oder gibt es da auch so was wie Arbeitsspeicher?
Achja, hier ist eine der Seiten, auf denen ich das Script angewendet habe:
http://uchiki.de/site/wp/bloodplus/
Wenn man auf eins der Links klickt, dann wird ein Bild der Größe 1600 x 1200 auf eine andere Größe verkleinert (automatisch per PHP.
Hier ist der PHP code:
Hab' jetzt nichts gefunden, was zu Speicher-Verbrauch führt...
Was meinst du mit Endlosschleife?
Eine Schleife ohne Ende ^^
Übrigens meine ich mit dem "Erstellen von Ordnern" nicht auf dem PC sondern auf dem Web Server, oder gibt es da auch so was wie Arbeitsspeicher?
Ja.
Hallo Yina,
für jemand der sich so wenig mit Webspace/Server auskennt,
nutzt du aber ganz schön komplexe Scripte.
Und leider kann ich keinen Fehler in dieser Klasse erkennen.
Übrigens ein sehr schönes Script, wo hast du das her?
Dann bin ich mal zu deinem Web und habe mir dort alles angeschaut.
Klappt doch augenscheinlich alles super. Bis auf dein Newsscript:
http://uchiki.de/site/
Ach ja, die Bilder sind wirklich gut gemacht.
Besonders http://uchiki.de/site/images_yina/viewing18.htm
Solltest dich vielleicht mal an richtiger Malerei dranhängen.
Ist nicht ironisch, wirklich ernst gemeint, du hast Talent.
Ja und zu deinem Fehler, wie gesagt nichts gefunden und Seite funktioniert.
Sofie
Hallo Yina,
für jemand der sich so wenig mit Webspace/Server auskennt,
nutzt du aber ganz schön komplexe Scripte.
Naja, komplex schon, aber es reicht vollkommen, wenn man weiß, wie man das Script installiert und das ist meistens nicht schwierig. Ich weiß nicht viel über die Details und Hintergründe, aber HTML Kenntnisse haben bis jetzt immer ausgereicht.
Und leider kann ich keinen Fehler in dieser Klasse erkennen.
Übrigens ein sehr schönes Script, wo hast du das her?
http://www.deruwe.de/thumbnails.html
Dann bin ich mal zu deinem Web und habe mir dort alles angeschaut.
Klappt doch augenscheinlich alles super. Bis auf dein Newsscript:
http://uchiki.de/site/
Ich weiß, das Script funktioniert nicht mehr, weil der Server voll ist und es keine neuen Sachen mehr schreiben kann.
Ach ja, die Bilder sind wirklich gut gemacht.
Besonders http://uchiki.de/site/images_yina/viewing18.htm
Solltest dich vielleicht mal an richtiger Malerei dranhängen.
Ist nicht ironisch, wirklich ernst gemeint, du hast Talent.
Danke, würde ich wirklich gerne versuchen, wenn man damit einigermaßen gut Geld verdienen könnte.
ich benutze einen PHP Script, der ein einziges Bild in verschiedene Versionen automatisch verkleinert.
Das klingt nach einem Script, welches tatsächlich Dateien anlegt (und nicht unbedingt temporär). Sofie hat recht, am Besten wird es sein du zeigst mal den Code. Wenn er zu lang ist ggf. auch bei pastebin nopaste o.ä.