php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-11-2008, 21:02
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard PHP-Kompression mit vielen Dateien

Ich habe mir da in einer Gallerie ziemlich viele Bilder geladen werden müssen eine Datei geschrieben, die die Bilder komprimieren sollte.
Dies funktioniert bei 1-10 Bildern auch ganz gut, aber wenn es dann so 50 Bilder sind oder sogar mehr werden scheinbar nur zufällig einige Bilder geladen und andere nicht.
Es scheint an der Kompression zu liegen, denn wenn die Bilder nicht kompirimiert werden funktioniert alles super.
Gibt es einen Weg diesen Fehler zu umgehen?

meine Datei für die Bilder-komprimierung:

PHP-Code:
<?

error_reporting
(E_ALL);

ob_start("ob_gzhandler");
if(isset(
$_GET['i']) && preg_match("/^[a-z0-9_-]+\.[a-z0-9]{3}$/i"$_GET['i']) && file_exists("./img/" $_GET['i'])){
 
$ext strtolower(substr($_GET['i'], -3));
 switch(
$ext){
  case 
"jpg":
   
$im imagecreatefromjpeg("./img/" $_GET['i']);
   
header("Content-type:image/jpeg");
   
imagejpeg($imNULL96);
   
imagedestroy($im);
  break;
  case 
"gif":
   
$im imagecreatefromgif("./img/" $_GET['i']);
   
header("Content-type:image/gif");
   
imagegif($im);
   
imagedestroy($im);
  break;
  case 
"png":
   
$im imagecreatefrompng("./img/" $_GET['i']);
   
header("Content-type: image/png");
   
imagepng($im);
   
imagedestroy($im);
  break;
 }
}
header("Content-Length:" ob_get_length());

?>
Mit Zitat antworten
  #2 (permalink)  
Alt 09-11-2008, 22:57
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Was soll das bringen? JPG, GIF und PNG sind allesamt komprimierte Formate.
Mit Zitat antworten
  #3 (permalink)  
Alt 11-11-2008, 13:49
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

Und trotzdem können sie noch weiter komprimiert werden.
Dadurch werden durchschnittlich 15- 20% weniger Daten übertragen.
Mit Zitat antworten
  #4 (permalink)  
Alt 11-11-2008, 13:52
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von jmc
Und trotzdem können sie noch weiter komprimiert werden.
Dadurch werden durchschnittlich 15- 20% weniger Daten übertragen.
Das mag zum Teil stimmen - meine Erfahrung mit JPG, MP3 und Konsorten sagt eher das Gegenteil -, aber der dafür nötige Prozessoraufwand steht in keinem Verhältnis zum Ergebnis.
Mit Zitat antworten
  #5 (permalink)  
Alt 11-11-2008, 14:36
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

@jmc: Wenn das Messwerte sind, dann hast du schlecht optimierte Grafiken. Wenn es Schätzungen sind, dann miss mal.
Mit Zitat antworten
  #6 (permalink)  
Alt 12-11-2008, 20:06
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

Es sind Messwerte und ich bin nicht derjenige, der die Bilder Dateigrösse der Bilder optimiert. (Der Server gehört ist gemietet.. da kann mir egal sein wie stark der CPU belastet wird )
Mit Zitat antworten
  #7 (permalink)  
Alt 12-11-2008, 20:58
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Das kann ich kaum glauben. Deshalb habe ich es selbst probiert und meine Messungen widersprechen dir völlig. Ich habe so gut wie gar keine Abweichungen zwischen unbehandelten und gzip-ten Bildern.

Zum Nachvollziehen: Ich habe 5 zufällige Wörter gegoogelt, jeweils einen beliebigen Treffer geöffnet, Datei > Seite speichern unter, Webseite komplett.
Dann das Verzeichnis geöffnet, alles gelöscht, was nich GIF, PNG oder JPEG ist.
Und so siehts aus:

$ du -hs pics*
476K pics1
2,8M pics2
308K pics3
504K pics4
188K pics5
$ gzip -r pics*
$ du -hs pics*
472K pics1
2,3M pics2
304K pics3
496K pics4
140K pics5

Der Effekt von gzip über den Daumen gepeilt:
pics1 1%
pics2 18%
pics3 1%
pics4 1,5%
pics5 20%

Das macht im Schnitt nur 8,3% weniger Datenmenge durch GZip-Kompression. Die Spitzenwerte von 1% zeigen, dass man die Bilder in sich schon so optimal komprimiert speichern kann, dass erneutes Komprimieren fast keinen Effekt hat.
Mit Zitat antworten
  #8 (permalink)  
Alt 12-11-2008, 21:21
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wie gut, dass hier alle an der Lösung des Problems interessiert sind...
Mit Zitat antworten
  #9 (permalink)  
Alt 12-11-2008, 21:46
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von jmc
(Der Server gehört ist gemietet.. da kann mir egal sein wie stark der CPU belastet wird )
Öh... Schon mal darüber nachgedacht, daß die CPU-Belastung unmittelbar damit zu tun haben könnte, daß er die Bilder nicht ausgeliefert kriegt?

Zitat:
Wie gut, dass hier alle an der Lösung des Problems interessiert sind...
Sind wir. Kompression ausschalten, Problem gelöst.
Mit Zitat antworten
  #10 (permalink)  
Alt 12-11-2008, 22:13
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

Ich weiss wirklich nicht genau woran es liegt, aber es liegt klar an der Enzahl der Dateien, nicht an der Grösse der Dateien. Deswegen vermute ich auch, dass trotz einer grossen Belastung für den CCPU nicht das das Problem ist.

Ausserdem wären es bei dir eher 14.2% von der Datenmenge her
(3767kb : 4343kb). Bei meinen Messungen auf der Seite mit auch mehr oder weniger zufällig hochgeladenen Bildern (da nicht von mir sondern von Benutzern hochgeladen) sind momentan bei 19.3% weniger Daten bei der komprimierten Übertragung.
Mit Zitat antworten
  #11 (permalink)  
Alt 13-11-2008, 01:58
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Versuche es mal so ...
PHP-Code:
function fail() { header('HTTP/1.0 404 Not Found'); exit; }

@(
$fn $_GET['i']) or fail();

if (
$pos strrpos($fn'.') && file_exists($fn)) {
    
$ext strtolower(substr($fn$pos+1));
    
header('Content-type: image/' $ext);
    
$img file_get_contents($fn);
    
$img_comp ob_gzhandler($imgPHP_OUTPUT_HANDLER_START PHP_OUTPUT_HANDLER_END);
    if (
$img_comp !== FALSE) {
        
header('Content-Length: ' strlen($img_comp));
        echo 
$img_comp;
    } else {
        
header('Content-Length: ' strlen($img));
        echo 
$img;
    }


Geändert von onemorenerd (13-11-2008 um 02:01 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 13-11-2008, 18:26
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank!!!
Jetzt noch einen 304-header senden und es klappt prima.
Ich habe 2 Tests gemacht. 122 Bilder an 8.4 MB in 7.1 Sekunden ohne Fehler 84 Bilder an 158.2MB in 119.2 Sekunden ohne Fehler.
Der Prozessor scheint also wirklich nicht das Problem gewesen zu sein. Mich macht das nun wirklich neugierig woran es denn sonst liegen könnte. Liegt das an der GD-Lib? Meine Art die Bilder zu öffnen und auszugeben ist tatsächlich ziemlich *** muss ich im Nachhinein eingestehen.
Mit Zitat antworten
  #13 (permalink)  
Alt 13-11-2008, 18:32
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Ich weiß auch nicht, ob es an den image-Funktionen lag. Die verbrauchen jedenfalls eine Menge Speicher, was in deinem Fall völlig überflüssig war, da du die Bilder gar nicht manipulierst. Bei großen Bildern erreicht man schnell das memory_limit.

Du solltest dir übrigens noch ein paar Gedanken über die Sicherheit dieser Methode machen.
Mit Zitat antworten
  #14 (permalink)  
Alt 14-11-2008, 09:11
jmc
 PHP Junior
Links : Onlinestatus : jmc ist offline
Registriert seit: Mar 2006
Beiträge: 868
jmc befindet sich auf einem aufstrebenden Ast
Standard

Da ich nicht genau deine Version nehme sondern wiederum alle Zeichen ausser [a-z0-9_-]+\.(?:jpeg|jpg|gif|png) nicht zulasse sollte es meines Erachtens relativ sicher sein, aber du kannst mir gerne erklären, was da das Problem ist.
Zuerst wollte ich mit dieser Datei die Bilder auch noch temporär verkleinern lassen (deswegen sind die imagecreatefrom da hängen geblieben), aber ich habe dann ziemlich schnell eingesehen, dass dies zu aufwendig ist .
Ich benutze ausserdem statt file_get_contents fread, das wenn man schon auf die performance achtet noch einiges besser ist.
Mit Zitat antworten
  #15 (permalink)  
Alt 14-11-2008, 10:40
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von jmc
Da ich nicht genau deine Version nehme sondern wiederum alle Zeichen ausser [a-z0-9_-]+\.(?:jpeg|jpg|gif|png) nicht zulasse sollte es meines Erachtens relativ sicher sein, aber du kannst mir gerne erklären, was da das Problem ist.
Passt schon.
Zitat:
Ich benutze ausserdem statt file_get_contents fread, das wenn man schon auf die performance achtet noch einiges besser ist.
http://benchmark.nophia.de/benchmarks-dateioperationen-k-3-inhalt-einer-datei-einlesen-grosse-datei-72kb-b-14.html#auswertung
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:33 Uhr.