Tag: PHP

PHP: realpath() for non-existing path

The php method realpath() can transform the string format of a path into a real path. Means, a path string like:


will become:


But this only works, if the path really exists. For non-existing paths, this function cannot be used. To get the same functionality, the following function can be used:

 * Get normalized path, like realpath() for non-existing path or file
 * @param string $path path to be normalized
 * @return false|string|string[]
public function normalizePath(string $path)
    return array_reduce(explode('/', $path), function($a, $b) {
        if ($a === null) {
            $a = "/";
        if ($b === "" || $b === ".") {
            return $a;
        if ($b === "..") {
            return dirname($a);

        return preg_replace("/\/+/", "/", "$a/$b");

How to ignore PHP_CodeSniffer warning: Line exceeds 120 characters;

When using codesniffer to check your code, a lot of warnings might appear when the lines are too long:

  73 | WARNING | Line exceeds 120 characters; contains 162 characters
  75 | WARNING | Line exceeds 120 characters; contains 124 characters
 102 | WARNING | Line exceeds 120 characters; contains 168 characters
 108 | WARNING | Line exceeds 120 characters; contains 121 characters

To ignore those warnings, we can add // phpcs:ignore as a comment to the end of a (too long) line. For example:

$message = 'This is my long message. It\'s not only long, it\'s extreeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeemly long'; // phpcs:ignore

PNG – deactivate interlace to avoid ‘libpng warning: Interlace handling should be turned on when using png_read_image’

I stumbled appon a warning message that was thrown by PHP when handling images with GD lib (e.g. imagecreatefrompng()). The message shown was:

libpng warning: Interlace handling should be turned on when using png_read_image

This message even exists, when deactivating ‘interlace’ with the help of:

imageinterlace($img, false);

The only solution is to deactivate for the processed image(s). This is possible with ImageMagick. To deactivate interlace on all images of a folder, the following command can be used:

magick mogrify -interlace none *.png

I used ImageMagick on macos and installed it with with HomeBrew:

brew install imagemagick

PHP ColorUtils

A neat collection of useful methods to convert colors between different color spaces is available on GitHub (MIT License). It can convert any values between RGB, HSL, CMYK, YUV and HEX colors.

I created a ready-to-use php class out of this method collection:


The methods itself are mostly self-explaining. To use the class, just include the php file into your script and you are ready to go:


The methods itself are static, they can be used like:

$hex = '#ffcc00';
$rgb = ColorUtils::hex2rgb($hex);

Which results in an array with three values (red, blue, green) in $rgb:

// [0 => 255, 1 => 204, 2 => 0]

Photo by Kelli Tungay on Unsplash

Fatal error: Call to undefined function bindtextdomain()

Fatal error: Call to undefined function bindtextdomain() in [...]

Tritt der Fehler auf, dann fehlt möglicherweise die PHP-Erweiterung Gettext. Diese kann in der php.ini aktiviert werden:


Ist diese Erweiterung noch nicht vorhanden, dann lässt sich diese unter macOS (am Beispiel von PHP7.0) über MacPorts installieren:

sudo port install php70-gettext

Apache neustarten:

sudo port unload apache2
sudo port load apache2

PHP: Wie bekommt man Gettext zum Laufen?

Zunächst erstellt man sich ein Verzeichnis, z.B. locales/, in dem die Übersetzungsdateien abgelegt werden. Die Verzeichnisstruktur sollte Unterverzeichnisse für jede Sprache, beispielsweise en/ für Englisch, de/ für Deutsch, usw. enthalten und wie folgt aufgebaut sein:


In diese Verzeichnisse kommen dann die Übersetzungsdateien (*.mo, *.po). Wie diese aufgebaut sind bzw erstellt werden, soll an dieser Stelle nicht weiter erläutert werden.

Einbindung in PHP

So sieht die Einbindung von Gettext in PHP aus:

$locale = 'de_DE';
$directory = './locales'; // diesen Pfad entsprechend anpassen!
$domain = 'default';

setlocale(LC_ALL, $locale.'.utf8');  // 'de_DE.utf8' (wichtig: utf8 ohne '-'!)
bindtextdomain($domain, $directory); // 'default', './locales'
textdomain($domain);                 // 'default'
bind_textdomain_codeset($domain, 'UTF-8');

Zu beachtende Punkte

Gettext funktioniert nicht wie gewünscht? Lokalisierung wird nicht angezeigt? Dies dann kann verschiedene Gründe haben. Hier ein paar Anmerkungen:

Der String in $locale muss eine gültige Lokalisierung sein, welche auch auf dem System zur Verfügung steht. Ist diese korrekt (bzw. existiert diese), dann gibt setlocale() true zurück, andernfalls false.

Im Fehlerfall sollte man also prüfen, ob das System die angegebene Lokalisierung auch bereitstellt. Das kann man der Ausgabe folgender Zeile entnehmen:


Das Encodings (UTF-8) muss bei setlocale() ohne jeglichen Bindestrich angegeben werden.

Die Angabe ‘default’ bezieht sich auf die Domain, also den Dateinamen der *.mo-Datei. Die *.po-Datei werden übrigens nicht direkt von Gettext verwendet. Diese werden aber benötigt, um die *.mo-Dateien zu erstellen.

MacPorts: mehrere PHP-Versionen gleichzeitig

MacPorts unterstützt jegliche PHP-Versionen. Diese können auch ohne Probleme gleichzeitig installiert werden. Die Pakete werden in MacPorts unter php56, php70, php71, ... usw. gelistet. Die notwendigen Befehle, um eine einzelne Version zu installieren:

MacPorts aktualisieren:

sudo port selfupdate
sudo port upgrade outdated

PHP Version (beispielsweise PHP 7.0) und ggf. erforderliche Module installieren:

sudo port install php70
sudo port install php70-apache2handler
sudo port install php70-... (je nach erforderlichen Modulen)

Nun zum Aktivieren der gewünschten PHP-Version: hier muss beachtet werden, dass es einen Unterschied zwischen der Konsole und der Anwendung von PHP in Apache gibt! So aktiviert man die PHP-Version an den unterschiedlichen Stellen:

PHP für die Konsole aktivieren:

sudo port select php php70

Überprüfen kann man die Version in der Konsole mit php -v.

PHP für Apache aktivieren:
In der Datei /opt/local/apache2/conf/http.conf die folgende Zeile einfügen oder aktivieren.

#LoadModule php5_module modules/mod_php56.so
LoadModule php7_module modules/mod_php70.so

Überprüfen kann man die Version mit phpinfo() in einer einfachen PHP-Datei.

Apache Neustarten:

sudo port unload apache2
sudo port load apache2

Composer global verwenden

In der Dokumentation zu Composer wird erläutert, wie man global auf composer.phar zugreifen kann, ohne permanent php composer.phar ins Terminal eingeben zu müssen:


You can place the Composer PHAR anywhere you wish. If you put it in a directory that is part of your PATH, you can access it globally. On unix systems you can even make it executable and invoke it without directly using the php interpreter.

After running the installer following the Download page instructions you can run this to move composer.phar to a directory that is in your path:

mv composer.phar /usr/local/bin/composer

Note: If the above fails due to permissions, you may need to run it again with sudo.

Note: On some versions of OSX the /usr directory does not exist by default. If you receive the error “/usr/local/bin/composer: No such file or directory” then you must create the directory manually before proceeding: mkdir -p /usr/local/bin.

Note: For information on changing your PATH, please read the Wikipedia article and/or use Google.

Now just run composer in order to run Composer instead of php composer.phar.