PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for Februar, 2010

WordPress Bilder optimieren mit WP-Smash.it und Zend_Http_Client

with 4 comments

Die WordPress Mediathek wächst und wächst, ab und zu sind auch recht große Screenshots dabei oder gar Bilder der Digitalkamera, die häufig sehr groß sind und Metadaten enthalten.

Mit dem Service Smush.it von Yahoo kann man sehr einfach seine Bilder optimieren lassen. Man lädt die zu optimierenden Bilder hoch und erhält eine Auswertung, wieviel Prozent Smush.it sparen konnte (wohlgemerkt ohne die Bildqualität zu verschlechtern, es werden nur Metadaten entfernt sowie die Farbpalette angepasst usw.) und man kann die Bilder dann als zip-Datei herunterladen. Laut FAQ verwendet Smush.it intern aktuell ImageMagick, pngcrush, jpegtran und gifsicle und wählt das beste Ergebnis.

Der Service bietet auch eine API an. Um uns Bloggern das Leben einfacher zu machen gibt es das WordPress-Plugin WP-Smush.it, welches automatisch alle neuen Bilder, die man in die Mediathek hochlädt durch Smush.it optimieren kann. Auch bereits vorhandene Bilder kann man mit einem Klick optimieren.

Im Durchschnitt erhält man dabei Größenoptimierungen von 5-40%, also durchaus akzeptabel, und es passiert im Hindergrund, man muss nicht extra mit Bildprogrammen rumhampeln oder mit Konsolenprogrammen wie optiPNG und Konsorten hantieren.

Ein Problem hatte ich jedoch: Meine Mediathek enthielt bereits 121 Bilder. Da ich nicht 121 Mal den „Smush.it now“ Link in der Mediathek klicken wollte, habe ich mir ein kleines Script geschrieben was das für mich erledigt.

Vorgehensweise ist wie folgt: Ich brauche zuerst alle IDs der Bilder, die ich komprimieren kann, denn ein Aufruf zum Optimieren sieht so aus:

https://www.phpgangsta.de/wp-admin/admin.php?action=wp_smushit_manual&attachment_ID=34

Ich möchte also 121 mal diese URL aufrufen, jeweils mit den passenden IDs. Die IDs hole ich mir eben schnell via phpMyAdmin aus der Datenbank mit dem Query:

SELECT ID FROM `wp_posts` WHERE `post_type` = 'attachment' AND `post_mime_type` LIKE 'image/%'

Das Ergebnis exportiere ich als csv-Datei, sodass ich eine Datei erhalte in der jede Zeile exakt eine ID enthält.

Um die entsprechende WordPress-Plugin-URL aufzurufen werde ich Zend_Http_Client verwenden. Sieht dann so aus:

<?php
$ids = file('ids.txt');

include 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();

$client = new Zend_Http_Client();
// Zu Debugzwecken möchte ich das Ergebnis in lesbarer Form, sonst kommt evtl. gzip zurück
$client->setHeaders(array(
    'Accept-encoding' => ''
));
// Timeout erhöhen, 10 Sekunden reichen nicht aus.
$client->setConfig(array('timeout' => 60));
$client->setCookieJar();

// Erste Anfrage: einloggen und eine Session starten (Cookie wird in den CookieJar gepackt und bei den folgenden Requests immer mitgesendet)
$client->setUri('https://www.phpgangsta.de/wp-login.php');
$client->setParameterPost('log', 'MeinAdministratorName');
$client->setParameterPost('pwd', 'MeinAdministratorPasswort');
$client->setParameterPost('rememberme', 'forever');
$client->setParameterPost('wp-submit', 'Anmelden');
$client->setParameterPost('redirect_to', 'https://www.phpgangsta.de/wp-admin/');
$client->setParameterPost('testcookie', '1');
$response = $client->request(Zend_Http_Client::POST);

foreach ($ids as $id) {
	$id = trim($id);
	$client->setUri('https://www.phpgangsta.de/wp-admin/admin.php?action=wp_smushit_manual&attachment_ID='.$id);
	$response = $client->request(Zend_Http_Client::GET);
	echo 'finished'.$id."\n";
}

echo "finished";

Zuerst müssen wir uns natürlich einloggen und speichern das Cookie im CookieJar. Erst danach können wir die URLs in einer Schleife aufrufen.

War eine schöne kurze Übung und garantiert interessanter und schneller als 121 Mal einen Link anzuklicken, wobei man zwischen jedem Klick 3-20 Sekunden warten muss, je nach Bildgröße.

Written by Michael Kliewe

Februar 13th, 2010 at 2:21 pm

Aktion: Die kleinste Blogsoftware der Welt!

with 95 comments

Inspiriert durch Stefan Wienströers Artikel auf SteviesWebsite möchte ich hier dazu aufrufen, den Rekord für das „kleinste Blog System der Welt“ zu brechen! Es geht darum eine Blogsoftware zu schreiben mit möglichst wenig Code. Stefan hat es mit 894 Byte geschafft, ein ganz rudimentäres CMS zu schreiben (das aber nicht ganz unten stehenden Regeln erfüllt).

Die folgenden Regeln werden definiert, damit auch alle Projekte den selben Funktionsumfang bieten:

  1. Die öffentlich sichtbare Seite muss alle Blogartikel in chronologischer Reihenfolge auflisten
  2. Jeder Artikel hat eine Überschrift, einen Artikeltext und eine Zeitangabe der Erstellung
  3. Es gibt einen passwortgeschützten Admin-Bereich, wo man neue Artikel erstellen kann
  4. Es muss kein gültiger HTML-Code sein, aber die Webseite muss im Firefox ≥ 3.5 darstellbar und nutzbar sein
  5. Es kann jede PHP Version ≥ 5.2 genutzt werden, es dürfen keine besonderen Extensions vorausgesetzt werden
  6. Es dürfen Short-Open-Tags genutzt werden
  7. Die Speicherung der Artikel soll in einer Datei stattfinden
  8. Es dürfen alle Tricks genutzt werden um kurzen Code zu schreiben: Weglassen von Umbrüchen und Leerzeichen, kurze Variablennamen usw. Es geht nicht um Lesbarkeit, sondern um Funktion und kleinen Code!
  9. Der SourceCode muss veröffentlicht werden (natürlich 😉 ), evtl. mit Erklärungen falls der Code unlesbar ist 😉
  10. Es ist möglich, seinen Code zu verbessern und mehrere Lösungen einzusenden

Die Aktion endet am 07.03.2010, ihr habt also 4 Wochen Zeit. Um teilzunehmen erstellt in eurem Blog einen Artikel mit einem Link zu dieser Aktion. Damit ich euren Rekord mit aufnehmen kann in die Liste benötige ich einen Trackback, einen Kommentar oder eine Email. Der SourceCode muss natürlich öffentlich zugänglich und herunterladbar sein, damit jeder das Ergebnis überprüfen kann.

Ich bin sehr gespannt wo die Grenze liegt, wenn man es wirklich drauf anlegt!

————————————-

Aktuelle Rekorde:
Weiterlesen »

Written by Michael Kliewe

Februar 9th, 2010 at 9:40 am

PHP Online IDE: CodeRun

with 3 comments

Hier ein kleiner Tip für euch: Schaut euch mal diese Online IDE von CodeRun an. Dort kann man PHP-Code online im Browser schreiben und auch Laufen lassen. Wenn man dort ein entsprechendes Paket gekauft hat kann man direkt aus der IDE auch Deployen.

Falls man seine Quelltexte veröffentlichen möchte kann man einen Permalink erstellen und andere teilhaben lassen.

Für die tägliche Arbeit an großen Projekten eher nicht zu gebrauchen, aber für kleine Testscripte oder die Zusammenarbeit mit anderen einen Blick wert.

http://www.coderun.com/ide

Written by Michael Kliewe

Februar 8th, 2010 at 9:55 am

Posted in PHP

Tagged with ,

PHP und HTTP AUTH bei 1und1 Webhosting

with one comment

Um das Zend Framework in der Webhosting-Umgebung bei 1und1 ans Laufen zu bekommen, gibt es ein paar Kleinigkeiten zu beachten:

Als erstes muss man bei 1und1 in der .htaccess-Datei angeben welche PHP-Version man benutzen möchte. Dies macht man mit der Zeile

AddType x-mapp-php5 .php

Außerdem muß man noch die folgenden 2 Zeilen hinzufügen, sonst erhält man einen 500er Fehler:

Options -MultiViews
RewriteBase /

Die RewriteBase gilt es natürlich anzupassen falls das Projekt über einen anderen Pfad erreicht werden muss.

Da PHP bei 1und1 als CGI läuft, muß man für die HTTP-Authentifizierung auch noch einen kleinen Workaround einbauen:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Damit wird die Authentifizierungsinformation in die Variable $_SERVER[‚REDIRECT_HTTP_AUTHORIZATION‘] geschrieben. Das sieht dann ungefähr so aus:

echo $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
//  Basic: d2lraTpwZWRpYQ==

Das ist die Base64-Darstellung von „Username:Passwort“.

Die entgültige .htaccess sieht dann so aus:

AddType x-mapp-php5 .php
Options -MultiViews

RewriteEngine On
RewriteBase /

# workaround for 1und1 php cgi mode
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Und so kommt man an Username + Passwort heran:

if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
 list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));
}

Written by Michael Kliewe

Februar 6th, 2010 at 10:53 am

HipHop für PHP

with 7 comments

Gestern war nun der große erhoffte Tag, Facebook wollte seinen neuen „PHP-Compiler“ veröffentlichen. Bis jetzt ist das noch nicht passiert, allerdings gab es ein offizielles Announcement und einen Videostream, in dem Näheres erläutert wurde.

Edit: Auf GitHub findet man mittlerweile den Sourcecode.

Hier ein paar erste Fakten, so wie ich sie bisher gelesen habe:

  • „HipHop for PHP“ übersetzt PHP-Code in C++ Code
  • Danach kann es mittels g++ kompiliert werden und man erhält eine ausführbare Datei
  • Diese Datei enthält auch direkt einen Webserver (basiert auf Libevent) und eine CLI-Schnittstelle. Um sein Projekt vom Internet verfügbar zu machen muss man nur seinen Apache/Lighty/Squid/etc umleiten (Reverse Proxy) auf diesen kleinen Miniwebserver, so kann man dann mehrere Projekte auf einem Port (80) laufen lassen.
  • Beim Übersetzen und Kompilieren wird der Code durch statische Analysen etc. optimiert, und z.B. der beste C++-Datentyp gewählt (PHP ist lose typisiert, C++ streng)
  • Es soll einen Just-In-Time-Compiler geben (HPHPi), mit dem man seine Anwendung testen kann, ohne sie jedes Mal zu übersetzen und zu kompilieren, denn das kann unter Umständen länger dauern.
  • Bei Facebook läuft das ganze seit einigen Monaten produktiv, man spart damit ca. 50% CPU-Last ein
  • Derzeit unterstützt es PHP 5.2 Code, PHP 5.3 wird noch nicht unterstützt. eval() kann nicht genutzt werden.

Facebook, die zweitgrößte Website der Welt, setzt „HipHop for PHP“ nun seit einigen Monaten produktiv ein, 90% des Traffics wird bereits damit abgewickelt, und es läuft wohl stabil. 300.000 Codezeilen und 5000 Unittests sollen es sein, und es wird wohl bald auf GitHub veröffentlicht, aktuell nur für Linux-Systeme (da Facebook auf Linux setzt), aber Windows könnte bald folgen wenn der Open-Source-Code erweitert wird.

Gerade für Firmen könnte das interessant sein, wenn man ein Drittel oder gar die Hälfte seiner PHP-Maschinen einsparen kann, ich bin sehr gespannt.

PHP-Extensions müssen neu geschrieben werden in C++. Wir werden also vielleicht eine zweigeteilte Welt bekommen, HipHop-kompatibler Code und „native PHP Code“. Wie kompatibel ist das ganze mit bestehendem Code, wie kann man dann debuggen, wie sieht dann der Deployment-Prozess aus, wie groß ist der CPU- und Memory-Performance-Vorteil gegenüber APC/XCache wirklich? Wieviele „unserer normalen Projekte“ sind CPU-beschränkt und nicht IO-beschränkt?

Interessant ist das ganze auch für Projekte, die dann eine kompilierte Version ausliefern können, das Deployment könnte sich auch auf eine Übersetzung, Kompilierung und dann Kopie einer Datei beschränken? Wir werden sehen…

Ich hoffe, dass wir in den nächsten Stunden und Tagen da mehr Informationen erhalten und der Sourcecode veröffentlicht wird. Es sind jedenfalls spannende Tage, die die Zukunft von PHP verändern könnten.

Written by Michael Kliewe

Februar 3rd, 2010 at 9:12 am

Posted in PHP

Tagged with , ,