FOL9000

PHP und MySQL-Connection auf dem Mac

von

Wer das vorinstallierte PHP auf dem Mac nutzt (also z.B. nicht XAMPP), ist vielleicht schon einmal an der schlichten MySQL-Connection gescheitert. Das hat einen einfachen Grund: PHP sucht die Socket-Datei an der falschen Stelle.

Update: Dieser Beitrag bezieht sich auf die Situation unter MacOS 10.6.8! Ob die gemachten Angaben auch unter neueren Betriebssystem-Version gelten, weiß ich leider nicht!

Das Problem ist, das MySQL den Socket in

/tmp/mysql.sock

anlegt, in der php.ini aber

/var/mysql/mysql.sock

steht. (Es ist übrigens sicher kein Fehler, vor dem Weiterlesen schnell zu prüfen, ob das auf dem eigenen Rechner auch so ist – schließlich kann das in anderen Versionen korrigiert sein.)

Wie meistens gibt es verschiedene Wege, mit diesem Problem umzugehen.

php.ini

Der einfachste Weg ist natürlich, den korrekten Wert in der php.ini einzutragen. Dazu sollte man zunächst nachsehen, ob es überhaupt schon eine php-ini-Datei gibt; sie findet sich unter /private/etc. Wer sicher gehen will, dass er auch wirklich die richtige Datei editiert, checkt eben mit einem kurzen phpinfo(), welche ini-Datei PHP benutzt. Ist sie noch nicht vorhanden, ist eine Datei php.ini.default am gleichen Ort, die der Ausgangspunkt für die neue php.ini wird:

sudo cp php.ini.default php.ini
sudo +w php.ini

In der so erzeugten php.ini können jetzt die Socket-Werte angepasst werden. Dazu einfach die folgenden Werte entsprechend korrigieren:

mysql.default-socket=/tmp/mysql.sock
mysqli.default-socket=/tmp/mysql.sock
pdo_mysql.default_socket=/tmp/mysql.sock

Diese Zeilen finden sich in der ini-Datei nicht untereinander, sondern an verschiedenen Stellen!

Mit dieser Methode hat man natürlich eine endgültige Lösung. Wer die php.ini aber erst aus der Default-Datei erzeugen musste, sollte sich die ini-Datei noch einmal gut anschauen, um zu wissen, was denn nun genau eingestellt ist. Es ist schließlich gut möglich, dass man aus der Default-Datei Werte und Einstellungen übernimmt, die man gar nicht haben will.

Das dümmste aber ist: Bei mir funktioniert das nicht! Was ich auch mache, PHP sucht immer unter /var/tmp! Jetzt kann es natürlich sein, dass ich irgendetwas simples übersehe; ich habe aber keine Lust tagelang zu suchen, deswegen passe ich einfach den Connection-String an.

Connection-String

Muss man nur die Werte in einer bestehenden php.ini anpassen, braucht man vor Seiteneffekten keine Angst zu haben. Wer das aber scheut oder wie ich damit keinen Erfolg hat, kann auch bei der Angabe von Connection-Strings den korrekten Socket-Wert vorgeben. Gehen wir mal davon aus, dass MySQL auf localhost läuft, könnte das bei einer Server-Angabe so aussehen:

localhost:/tmp/mysql.sock

Dies ist auch die Server-Angabe, die man machen kann, wenn bei Installern etc. der Server abgefragt wird.

Ein kompletter Connection-String dagegen könnte wie folgt lauten:

mysql:host=localhost;dbname=xyz;unix_socket=/tmp/mysql.sock'

Bei Magento auf dem Mac passt das nicht ganz. Dort muss man den Namen der Datenbank weglassen, weil er gesondert angegeben wird. Bei mir gehts mit folgendem Connection-String:

mysql:host=localhost;unix_socket=/tmp/mysql.sock;charset=utf-8

Link

Nicht immer ist die Angabe des Connection-Strings möglich und vielleicht möchte man auch eine endgültigere Lösung. Ein Fall, wo kein Connection-String angegeben werden kann, ist z.B. das MediaWiki. Hier hilft es, einen Link auf die gesuchte Socket-Datei anzulegen:

sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Natürlich lässt sich hier keine Angabe machen, die für alle Installationen und Anwendungen gilt, aber ich glaube, das Prinzip ist klar. Man muss halt ein wenig probieren.

Kommentare sind geschlossen.