Installer le support de postgresql sur PHP avec brew sur OSX Yosemite

support postgresql pour PHP sur OSX avec brew

J’utilise Postgresql pour certains projets et mon environnement de travail est OSX (Yosemite).

Pour activer le support de postgresql sur PHP avec brew, il faut réinstaller (recompiler) PHP avec la bonne option : –with-postgresql

Installer le suppport de postgresql pour PHP

 

$ brew reinstall php70 --with-postgresql

Idem avec une autre version de php :

$ brew unlink php70
[...]
$ brew link php56
[...]
$ brew reinstall php56 --with-postgresql

 

Installer le driver pdo

La suite de cet article concerne seulement une installation qui aurait le support postgresql mais pas le driver pdo mais en général, brew installe les deux.

Le driver pdo-pgsql est disponible en standard sur brew.

$ brew search pgsql
homebrew/php/php54-pdo-pgsql
homebrew/php/php55-pdo-pgsql
homebrew/php/php56-pdo-pgsql
homebrew/php/php70-pdo-pgsql

 

Installer le driver pdo-pgsql avec PHP7

Pour l’installer :

$ brew install php70-pdo-pgsql
==> Installing php70-pdo-pgsql from homebrew/php
==> Installing dependencies for homebrew/php/php70-pdo-pgsql: postgresql
==> Installing homebrew/php/php70-pdo-pgsql dependency: postgresql
==> Downloading https://homebrew.bintray.com/bottles/postgresql-9.5.1.yosemite.bottle.tar.gz
######################################################################## 100,0%
==> Pouring postgresql-9.5.1.yosemite.bottle.tar.gz
==> Caveats
If builds of PostgreSQL 9 are failing and you have version 8.x installed,
you may need to remove the previous version first. See:
 https://github.com/Homebrew/homebrew/issues/2510

To migrate existing data from a previous major version (pre-9.0) of PostgreSQL, see:
 http://www.postgresql.org/docs/9.5/static/upgrading.html

To migrate existing data from a previous minor version (9.0-9.4) of PosgresSQL, see:
 http://www.postgresql.org/docs/9.5/static/pgupgrade.html

 You will need your previous PostgreSQL installation from brew to perform `pg_upgrade`.
 Do not run `brew cleanup postgresql` until you have performed the migration.

To reload postgresql after an upgrade:
 launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
 launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Or, if you don't want/need launchctl, you can just run:
 postgres -D /usr/local/var/postgres
==> Summary
🍺 /usr/local/Cellar/postgresql/9.5.1: 3,118 files, 35M
==> Installing homebrew/php/php70-pdo-pgsql
==> Downloading https://php.net/get/php-7.0.4.tar.bz2/from/this/mirror
==> Downloading from https://secure.php.net/distributions/php-7.0.4.tar.bz2
######################################################################## 100,0%
==> /usr/local/opt/php70/bin/phpize
==> ./configure --prefix=/usr/local/Cellar/php70-pdo-pgsql/7.0.4 --with-pdo-pgsql=/usr/local/Cellar/postgresql/9.5.1 --with-php-config=/usr/local/opt/php70/bin/php-config
==> make
==> Caveats
To finish installing pdo_pgsql for PHP 7.0:
 * /usr/local/etc/php/7.0/conf.d/ext-pdo_pgsql.ini was created,
 do not forget to remove it upon extension removal.
 * Validate installation via one of the following methods:
 *
 * Using PHP from a webserver:
 * - Restart your webserver.
 * - Write a PHP page that calls "phpinfo();"
 * - Load it in a browser and look for the info on the pdo_pgsql module.
 * - If you see it, you have been successful!
 *
 * Using PHP from the command line:
 * - Run `php -i "(command-line 'phpinfo()')"`
 * - Look for the info on the pdo_pgsql module.
 * - If you see it, you have been successful!
==> Summary
🍺 /usr/local/Cellar/php70-pdo-pgsql/7.0.4: 5 files, 88.6K, built in 51 seconds

Vérifier que le module est bien présent :

 

$ php -m | grep pgsql
pdo_pgsql

Activer le driver avec Apache

Pour l’activer avec Apache si vous utilisez php-fpm, il faut relancer php-fpm :

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

Sinon avec brew services :

$ brew services restart php70
Stopping `php70`... (might take a while)
==> Successfully stopped `php70` (label: homebrew.mxcl.php70)
==> Successfully started `php70` (label: homebrew.mxcl.php70)

Vérifier la présence du driver avec phpinfo() :

 

osx-brew-php70-pdo-pgsql

 

Activer le driver avec plusieurs version de PHP

Si vous utilisez plusieurs versions de PHP en même temps, il va falloir installer le driver pour chaque version.
Par exemple, PHP7 est votre version active mais vous avez aussi php56. Il faut rendre active la version 56, et installer le driver puis rendre active PHP7 à nouveau.

$ brew unlink php70
Unlinking /usr/local/Cellar/php70/7.0.4... 18 symlinks removed
$ brew link php56
Linking /usr/local/Cellar/php56/5.6.19... 17 symlinks created
$ php -v
PHP 5.6.19 (cli) (built: Mar 10 2016 10:09:40)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
$ brew install php56-pdo-pgsql
==> Installing php56-pdo-pgsql from homebrew/php
==> Downloading https://php.net/get/php-5.6.19.tar.bz2/from/this/mirror
==> Downloading from https://secure.php.net/distributions/php-5.6.19.tar.bz2
######################################################################## 100,0%
==> /usr/local/opt/php56/bin/phpize
==> ./configure --prefix=/usr/local/Cellar/php56-pdo-pgsql/5.6.19 --with-pdo-pgsql=/usr/local/Cellar/postgresql/9.5.1 --with-php-config=/usr/local/opt/php56/bin/php-config
==> make
==> Caveats
To finish installing pdo_pgsql for PHP 5.6:
  * /usr/local/etc/php/5.6/conf.d/ext-pdo_pgsql.ini was created,
    do not forget to remove it upon extension removal.
  * Validate installation via one of the following methods:
  *
  * Using PHP from a webserver:
  * - Restart your webserver.
  * - Write a PHP page that calls "phpinfo();"
  * - Load it in a browser and look for the info on the pdo_pgsql module.
  * - If you see it, you have been successful!
  *
  * Using PHP from the command line:
  * - Run `php -i "(command-line 'phpinfo()')"`
  * - Look for the info on the pdo_pgsql module.
  * - If you see it, you have been successful!
==> Summary
🍺  /usr/local/Cellar/php56-pdo-pgsql/5.6.19: 5 files, 552.6K, built in 47 seconds
php -i | grep pgsql
Additional .ini files parsed => /usr/local/etc/php/5.6/conf.d/ext-pdo_pgsql.ini
PDO drivers => mysql, odbc, sqlite, pgsql
pdo_pgsql

Redémarrer php-fpm pour prendre en compte le nouveau driver :

$ brew services restart php56
Stopping `php56`... (might take a while)
==> Successfully stopped `php56` (label: homebrew.mxcl.php56)
==> Successfully started `php56` (label: homebrew.mxcl.php56)

Si vous voulez php7 par défaut, il faut le réactiver :

$ brew unlink php56
Unlinking /usr/local/Cellar/php56/5.6.19... 18 symlinks removed

$ brew link php70
Linking /usr/local/Cellar/php70/7.0.4... 17 symlinks created

$ php -v
PHP 7.0.4 (cli) (built: Mar 10 2016 10:26:32) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

Apache: compresser les logs générés par cronolog

Dans un article précédent, j’expliquais comment utiliser cronolog avec Apache pour créer des fichiers en fonction de la date.

On obtient des fichiers classés de la sorte :

/var/log/apache2# ls -l 2016/01/
-rw-r--r-- 1 root root 4136552 Jan 1 23:59 01_blog.preprod_access.log
-rw-r--r-- 1 root root 86773599 Jan 1 23:59 01_blog.prod_access.log
-rw-r--r-- 1 root root 5314165 Jan 2 23:59 02_blog.preprod_access.log
-rw-r--r-- 1 root root 177562123 Jan 2 23:59 02_blog.prod_access.log
-rw-r--r-- 1 root root 5804359 Jan 3 23:59 03_blog.preprod_access.log
-rw-r--r-- 1 root root 159230127 Jan 3 23:59 03_blog.prod_access.log
[...]

Cronolog  ne compresse pas les fichiers qu’il écrit.

Pour faire de la place et archiver progressivement les logs, un script à base de la commande find fait largement l’affaire :

find /var/log/apache2/`date +%Y`/ -name « *.log » -mtime +1 -exec gzip « {} » « ; »

Ici, j’ai ajouté `date +%Y` dans le chemin de recherche des logs pour fonctionner avec les logs de l’année courante.

  • -mtime +1 : recherche les fichiers dont la date de modification est supérieure à 24h (1*24h)
/var/log/apache2# ls -l 2016/01/
total 579552
-rw-r--r-- 1 root root 180159 Jan 1 23:59 01_blog.preprod_access.log.gz
-rw-r--r-- 1 root root 5723517 Jan 1 23:59 01_blog.prod_access.log.gz
-rw-r--r-- 1 root root 225293 Jan 2 23:59 02_blog.preprod_access.log.gz
-rw-r--r-- 1 root root 9896313 Jan 2 23:59 02_blog.prod_access.log.gz
-rw-r--r-- 1 root root 241911 Jan 3 23:59 03_blog.preprod_access.log.gz
-rw-r--r-- 1 root root 9817631 Jan 3 23:59 03_blog.prod_access.log.gz
[...]

Apache : interdire l’accès à un fichier avec mod_rewrite

Il existe un flag «F» lors de la définition d’une règle de réécriture permettant d’envoyer un code de réponse HTTP 403 (accès interdit).

Pour interdire l’accès à un fichier en particulier, on écrira alors

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^fichier.ext$ - [F,L]
</IfModule>

Pour interdire l’accès à un groupe de fichier, on pourra écrire :

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule .*\.sql$ - [F,L]
</IfModule>

Apache : loguer le temps pour servir une requête

Pour l’optimisation d’un site et son analyse, il peut être intéressant de savoir combien de temps Apache  met pour servir une requête.

C’est possible via le module mod_log_config et ses options de format de la directive LogFormat :

  • %T : le temps pour servir la requête en secondes
  • %D : le temps pour servir la requête en microsecondes

 

Exemple de configuration d’un domaine :

<VirtualHost *:8080>
    DocumentRoot /var/www/domain.com

    <Directory /var/www/domain.com>
        Options FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ServerName domain.com

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T/%D" vhost
    CustomLog /var/log/apache2/domain.com/access.log vhost
    ErrorLog /var/log/apache2/domain.com/error.log
</VirtualHost>

Dans cet exemple, on ajoute le temps en secondes et en microsecondes à la fin d’un format classique.

Pour faire quelques tests, j’ai créé le fichier php suivant :

<?php
$us = rand(1, 999999);
usleep($us);
echo "slept for $us microseconds";

 

Exemple des logs générés :

127.0.0.1 - - [14/Aug/2015:17:26:41 +0200] "GET /slow.php HTTP/1.0" 200 29 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36" 0/875640
127.0.0.1 - - [14/Aug/2015:17:26:46 +0200] "GET /slow.php HTTP/1.0" 200 29 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36" 0/176823

Le temps en microsecondes affiché dans la page de test correspond bien au temps fourni par apache.

 

Symfony : profiler et debugger introuvables (404 Not Found)

Sur une nouvelle installation, il arrive que la route pour appeler le profiler soit introuvable.

La première chose à vérifier est la configuration Apache. Il faut que la directive AcceptPathInfo soit active. Par exemple, dans une balise <Directory> :

<VirtualHost *:8080>
    DocumentRoot "/var/www/symfony/web"
    ServerName www.acme.com

    <Directory /var/www/750g/web>
        AcceptPathInfo On
    </Directory>
<VirtualHost>

La seconde chose est de vérifier si mod_rewrite est bien activé si vous utilisez une réécriture pour cache app_dev.php ou app.php des urls.

 

Apache: gérer les logs avec cronolog

Cronolog est un outil qui lit les données depuis l’entrée standard pour les écrire dans des fichiers de sortie dont les noms sont dynamiques en fonction du temps. Par exemple, il est souvent utile de pouvoir séparer les logs Apache dans des fichiers quotidiens.

Exemple classique d’utilisation :

CustomLog "|/usr/sbin/cronolog /var/log/apache2/%Y-%m-%d_domain.com_access.log" combined

Ici, les logs de votre vhost domain.com seront dans des fichiers quotidiens bien séparés.  Le fichier de sortie sera du type 2015-08-05_domain.com_access.log

D’autres exemples :

  • Un fichier par heure :
CustomLog "|/usr/sbin/cronolog /home/log/apache2/%H_domain.com_access.log" combined
  • Un dossier par année, mois et un fichier par jour :
CustomLog "|/usr/sbin/cronolog /home/log/apache2/%Y/%m/%d_domain.com_access.log" combined

Apache: redirect permanent avec mod_rewrite

Avant d’écrire des règles de ré-écriture, il faut activer mod_rewrite dans la configuration apache et activer le moteur de ré-écriture dans votre contexte (fichier de configuration apache ou htaccess).

Ré-écrire une url vers une autre :

RewriteEngine On
RewriteRule /oldurl  /newurl [R=301,L]

Pour rediriger un domaine vers un autre, par exemple un domaine sans les « www » vers la version avec les « www » ou le contraire :

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.tipun\.ch$ [NC]
RewriteRule ^(.*)$ http://tipun.ch/$1 [R=301,L]

L’url http://www.tipun.ch est redirigée vers http://tipun.ch