Tag: PHP

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 point is that this message is not caused by any wrong php code, it is caused by the processed images itself. The only solution is to deactivate interlace 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:

https://github.com/mixable/color-utils

Usage

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:

<?php
require('ColorUtils.php');

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 [...]

This error might be caused by a missing GetText extension. If this is the case, you have to enable the extension in your php.ini:

extension=php_gettext.dll

If the extension is not installed yet, this is how to install gettext on macOS (for PHP7.0):

sudo port install php70-gettext

Afterwards, do not forget to restart Apache:

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:

locales/
  de/
    LC_MESSAGES/
      default.po
      default.mo
  en/
    LC_MESSAGES/
      ...

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 '-'!)
putenv('LC_ALL='.$locale);
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:

print_r(ResourceBundle::getLocales(''));

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.

Apache2, PHP und MySQL über MacPorts installieren

Es gibt hier im Blog bereits eine Vielzahl an Posts zu diesem Thema. Warum? Mit jedem Update von Mac OS X scheint sich wieder etwas zu ändern, sodass die Installation von Apache / PHP / MySQL mittels MacPorts nicht mehr funktionieren möchte.

Was bei den einzelnen OS X Versionen zu beachten ist, ist in den HowTo-Beiträgen auf macports.org bestens beschrieben: https://trac.macports.org/wiki/howto.

Detaillierte Information gibt es auf den Unterseiten zu Apache2, PHP und auch MySQL.

Firefox – Content Encoding Error / Google Chrome – ERR_CONTENT_DECODING_FAILED

Beim Öffnen einer Webseite, erhält man folgenden Fehler in Google Chrome:

Error 330 (net::ERR_CONTENT_DECODING_FAILED): Unknown error

Nutzt man FireFox dann sieht dieser Fehler so aus:

Content Encoding Error
The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression.

Woran liegt das?