Dienstag, 15. September 2009

MIME type problem mit Symfony's sfValidatorFile unter PHP 5.3.0

Wenn Sie die Symfony-Klasse sfValidatorFile in der Version 1.2.8 und älter, zusammen mit PHP 5.3.0 nutzen, werden Sie die Fehlermeldung:
"Invalid mime type (image/jpeg; charset=binary)"
erhalten. Hier ein Beispiel mit eine jpg-Datei. Das Problem trift aber auch auf andere mime types zu!

Der Grund für das Problem liegt nicht bei Symfony, sondern in eine Änderung in der PHP-Version 5.3.0 Die PHP-Funktion finfo_file liefert jetzt in der Version 5.3.0 nicht nur den mime type (z.B. "image/jpeg") sondern auch den character set, wie oben bereits in der Fehlermeldung gezeigt:
"image/jpeg; charset=binary"

Das Problem wird hier erläutert:
http://bugs.php.net/bug.php?id=48885
Hier wird deutlich erwähnt, dass es ein Feature und kein Bug ist!

Leider ist diese gravierende Änderung, die die Rückvärtskompatibilität beeinträchtigt, nicht in die Dokumentation eingeflossen:
http://php.net/manual/en/function.finfo-file.php

Entwickler bei ZEND haben den code in ihre lib nachgezogen, sodass es mit beiden Versionen klar kommt.

Bis Symfony nachgezogen hat, können Sie sich mit diesem work around selber helfen. In Ihre Form-Klasse, wo Sie sfValidatorFile nutzen, geben Sie einfach explizit die "neuen" mime types mit:

$this->validatorSchema['bild'] = new sfValidatorFile(array('mime_types' =>
array(
'image/jpeg; charset=binary',
'image/pjpeg; charset=binary',
'image/gif; charset=binary',
'image/png; charset=binary',
'image/x-png; charset=binary',
)));

Und wenn Sie wie ich, auch abwechselnd mit älteren PHP-Versionen arbeiten, geben Sie einfach beide formate mit:

$this->validatorSchema['bild'] = new sfValidatorFile(array('mime_types' =>
array(
'image/jpeg',
'image/pjpeg',
'image/gif',
'image/png',
'image/x-png',
'image/jpeg; charset=binary',
'image/pjpeg; charset=binary',
'image/gif; charset=binary',
'image/png; charset=binary',
'image/x-png; charset=binary',
)));

Viel Erfolg!

Dienstag, 1. September 2009

MySQL Socket-Problem unter Mac OS X

Nach dem wir nun Apache, MySQL und PHP auf dem Mac OS X (Snow Leopard) zum laufen gebracht haben (siehe vorheriger Blogeintrag), wollen wir auch symfony mit dem doctrine OR-Mapper zum fliegen bringen.

Die Installation der 64-bit-Version von MySQL (mysql-5.1.37-osx10.5-x86_64.dmg) unter Snow Leopart ist übrigens problemlos.

Wenn man aber mit doctrine-Mittel gegen die MySQL-Datenbank arbeiten will, bekommt man folgende Meldung:
Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) in…

Das hat damit zu tun, dass die php.ini (ursprunglich die php.ini.default vom Snow Leopard bereitgestellt) etwas unglücklich konfiguriert ist.
Das Verzeichnis für MySQL's PDO-Socket ist falsch angegeben. Der Parameter pdo_mysql.default_socket in der php.ini zeigt auf das Verzeichnis
/var/mysql/mysql.sock

Es wäre besser die Zeile mit einem ";" komplett zu deaktivieren, da dann die MySQL defauts verwendet wird.
Ein Blick in die MySQL-Doku verrät jedoch, dass das default-Verzeichns für die MySQL Socket-Datei "/tmp" ist.

Also, das Problem ist entweder so
; pdo_mysql.default_socket=/var/mysql/mysql.sock
oder so
pdo_mysql.default_socket=/tmp/mysql.sock
aus dem Weg geräumt.

Apache und PHP unter Mac OS X einrichten

Hier ein kleines Kochrezept für das Einrichten eines virtual Hosts unter Apache wo auch PHP benötigt wird.

Schritt 1:
Der vorinstallierte Apache Webserver starten:
- In den Systemeinstellungen auf "Freigaben" klicken.
- "Webfreigabe" anwählen.

Jetzt erscheint in dem Dialog rechts die Adresse zu der persönlichen Webseite:
http://[ihre IP-Adresse]/[ihr USER]/
Und die Webseite ihres Computers:
http://[ihre IP-Adresse]

Die Webseite Ihres Computers erreichen sie auch mit dem vordefinierten Hostnamen "localhost":
http://localhost/

localhost hat, neben bei erwähnt, die IP-Adresse 127.0.0.1

Schritt 2:
Tragen Sie in /etc/hosts einen neuen Hostnamen ein, mit dem wir später eine Webseite unter einem eigenem (virtuellem) Host erreichen.
Beispiel:
127.0.0.1 meintestdomain.de

Nach ein neustart des Rechners erreichen wir mit "meintestdomain.de" die selbe Webseite wie mit "localhost", da wir für meintestdomain.de die selbe IP-Adresse wie für localhost vergeben haben.

Schritt 3:
Jetzt konfigurieren wir den Apache Webserver für den Betrieb mit unserem neuen (virtuellen) Host meintestdomain.de

In der Konfigurationsdatei /private/etc/apache2/httpd.conf
aktivieren wir die Zeile
#Include /private/etc/apache2/extra/httpd-vhosts.conf
indem wir das "#" entfernen.
Das ist die Konfigurationsdatei für virtuelle Hosts.

Damit wir eine Testwebseite zum anzeigen haben, legen wir erst das Verzeichnis "meintestdomain" z.B. in unserem "home-Ordner" an.
Neues Verzeichnis: /Users/[ihr User]/meintestdomain
In diesem Verzeichnis legen Sie dann irgend eine HTML Datei ab, mit dem Namen index.html
Kopieren Sie z.B. die Datei, die vom System angelegt worden ist:
http://[ihre IP-Adresse]/[ihr USER]/
Die befindet sich hier: /Users/[ihr USER]/Sites/index.html

In der Konfigurationsdatei
/private/etc/apache2/extra/httpd-vhosts.conf
konfigurieren wir nun unser virtueller Host:

<virtualhost>
ServerName meintestdomain.de
DocumentRoot "/Users/[ihr User]/meintestdomain"
DirectoryIndex index.html
<directory>
AllowOverride All
Allow from All
</directory>
</virtualhost>

Starten Sie jetzt Apache neu, in dem Sie in dem Einstellungen unter "Schritt 1" oben "Webfreigabe" ab- und wieder anwählen.

Jetzt erreichen Sie die Webseite unter:
http://meintestdomain.de/

Schritt 4:
PHP konfigurieren.

Zunächst müssen wir das PHP Modul in Apache aktivieren.
In der uns jetz bekannten Konfigurationsdatei
/private/etc/apache2/httpd.conf
aktivieren wir die Zeile
#LoadModule php5_module libexec/apache2/libphp5.so
in dem wir das "#" entfernen.

Starten Sie jetzt Apache neu, in dem Sie in dem Einstellungen unter "Schritt 1" oben "Webfreigabe" ab- und wieder anwählen.

Machen Sie jetzt ein erster Test. Erstellen Sie in dem Ordner, der in der virtual Host- Konfiguration "DocumentRoot" genannt wurde, die Datei test.php mit folgendem Inhalt:
<?php phpinfo(); ?>

Jetzt erreichen Sie diese Seite mit: http://meintestdomain.de/test.php
Sie sehen sämtliche PHP-Einstellungen.

Unter anderem sehen Sie, dass PHP in dem Ordner /etc nach eine Konfigurationsdatei sucht. Siehe "Configuration File (php.ini) Path"
Beachten Sie, dass "/etc" nur ein Verweis auf den physischen Ordner /private/etc ist!

Sie sehen, dass es keine php.ini in dem Ordner /private/etc gibt. PHP kommt auch ohne Konfigurationsdatei aus! Wenn Sie aber eigene Änderungen machen wollen, kopieren Sie die Datei php.ini.default nach php.ini und machen darin Ihre Einstellungen.

Fertig!

Viel Spaß :-)