php-fpm segfault at f6 avec APC

En voulant modifier la configuration d’APC, pour augmenter la taille d’un segment de 30M à 64M, j’ai uniquement modifié la directive apc.shm_size. L’opération m’as valu une erreur de segmentation lors du démarrage de php-fpm.

Je me suis donc mis à la tâche de mettre à jour PHP ainsi que tous ces modules PECL sous Gentoo. Une fois la mise à jour s’étant bien passé, APC est à la version 3.1.9 mais php-fpm refuse toujours de démarrer… J’ai donc remis la valeur de apc.shm_size à 30M et php-fpm s’est très bien lancé.

On peut donc vérifier la taille maximum de mémoire partagée allouée par le système de le fichier /proc/sys/kernel/shmmax :

Par conséquent, on peut voir qu’APC n’a pas pu réserver 64M de mémoire partagée, puisque le système lui refuse. Je déplore un peu le manque de message d’erreur et l’erreur de segmentation qui peut provenir de “nul-part” si l’on configure son système automatiquement.

À ce stade vous avez deux possibilités:
Continue reading php-fpm segfault at f6 avec APC

facebooktwittergoogle_plusredditpinterestlinkedinmail

Erreur PHP – require_once(): Unable to allocate memory for pool

Depuis peu, PHP me sort des erreurs assez bizarres, à savoir des “Unable to allocate memory for pool“. Ceci se passe notamment sur les fonctions require_once et include_once. Après quelques temps de recherche, il s’avère que c’est en fait APC qui créé cette erreur lorsqu’il n’a plus assez de place dans sa mémoire.

C’est pourquoi, pour éviter ce bug – voir ici le rapport de bug sur php.net – vous devez augmenter la mémoire allouée à APC avant d’attendre une mise à jour corrigeant ce problème.
Dans le fichier /etc/php.d/apc.ini (sous CentOS) éditez donc la ligne contenant la directive apc.shm_size en y ajoutant plusieurs mégas. Pour information, voici la configuration du serveur hébergeant D-Sites.com:

facebooktwittergoogle_plusredditpinterestlinkedinmail

PHPpgAdmin 4.2.2 et PHP 5.3

Depuis PHP 5.3 toutes les fonctions utilisant les regex POSIX (ereg* et split*) sont maintenant obsolètes (qualifiée de DEPRECATED dans la documentation) et vont être supprimées dans PHP 6. Ces fonctions étant moins performantes, devenues presque inutiles à tous les projets cherchant la performance et surtout alourdissant PHP dans le sens où il y avait deux choix possible de regex, il était normal qu’elle disparaissent.

Néanmoins, il faut savoir que c’est la méthode la plus ancienne et donc la plus utilisée dans les portions de codes les plus vielles. Il se trouve que dans la version 4.2.2 de phpPgAdmin (dernière version stable, sortie il y a 1 an à deux jours près ;-)) il y a encore ces fonctions à quelques endroits, provoquant des Warning lors de l’éxécution de phpPgAdmin sous PHP 5.3.

Pour supprimer ces erreurs, voici un patch dans lequel j’ai remplacer toutes les occurrences de ereg* et split* par les équivalents en regex PCRE:

facebooktwittergoogle_plusredditpinterestlinkedinmail

Cannot represent a stream of type SSH2 Channel as a select()able descriptor

Une extension PHP nommé ssh2, que l’on peut retrouver dans le dépôt pecl permet de se connecter à un serveur SSH depuis un script PHP à l’aide de plusieurs fonctions. Plus particulièrement, la fonction ssh2_shell qui retourne un flux de données, ou stream, nous permet de mettre en place entre le script PHP et le serveur SSH un vrai échange complet. L’intérêt d’avoir un flux de données pour converser avec un serveur SSH est que l’on peut manipuler assez facilement à l’aide de toutes les fonctions stream_* ces flux. Ça, c’est la théorie.

En pratique, il s’avère que l’utilisation d’un flux SSH2 Channel (retourné par ssh2_shell) avec la fonction stream_select qui permet d’attendre que le flux “change” – c’est-à-dire qu’une donnée arrive – est impossible. En effet, pour utiliser le flux avec stream_select, il faut pouvoir transformer ce flux en une donnée utilisable par la fonction C select(). C’est ce que l’on appelle “caster un stream” en franglais et “to cast a stream” en anglais. Le problème, c’est que la librairie pecl/ssh2 (basée sur libssh2) n’implémente pas cette fonctionnalité, ce qui nous donne droit à un magnifique:

Warning: stream_select() [function.stream-select]: cannot represent a stream of type SSH2 Channel as a select()able descriptor in /path/to/file.php on line XX

Nous allons donc voir comment ajouter cette fonctionnalité simplement, à l’aide de patchs développés par mes soins. Continue reading Cannot represent a stream of type SSH2 Channel as a select()able descriptor

facebooktwittergoogle_plusredditpinterestlinkedinmail

PHP 5.2.10 – PEAR est cassé

En changeant de version vers la nouvelle à cause d’un BUG, il est possible d’en trouver d’autres… C’est le cas dans PHP 5.2.10 où le package PEAR n’est pas bien installé. Les “channels” ne sont pas bien configurés… En effet, lors de la compilation, on a déjà des erreurs comme celles-ci:

Warning: Cannot use a scalar value as an array in phar://install-pear-nozlib.phar/PEAR/ChannelFile.php on line 139

C’est donc bien que le phar des channels n’est pas correct. Après l’installation, lorsque l’on essaye d’installer le packet Net_IPv6 par exemple, on a ce message:

pear.php.net is using a unsupported protocal – This should never happen.
install failed

Continue reading PHP 5.2.10 – PEAR est cassé

facebooktwittergoogle_plusredditpinterestlinkedinmail

[notice] child pid XXXXX exit signal Segmentation fault (11)

L’erreur de Segmentation fault arrive – parfois – sans prévenir, elle est le témoin d’un bug ou d’une erreur dans le script PHP. La double assignation de variables peut faire ça ($var1 = $var2 = 'oups';) mais c’est souvent une erreur non-humaine… Elle est visible du côté utilisateur car le processus lui même de la page contenant cette erreur est “killé”, ce qui en résulte une réponse vide du serveur Apache, ce qui fait que Firefox présente une jolie fenêtre “Ouverture fichier.php”.

Capture-Ouverture de tests.php

En effet, j’était avec Apache 2.2.9 et PHP 5.2.6-1+lenny3 (installé via apt-get) et il m’est arrivé quelque chose d’assez surprenant, c’est une erreur de segmentation lors de l’assignation à une variable quelconque du résultat PDOStatement d’une requête faite avec PDO::query. Une heure ou deux à chercher d’où pouvait venir le problème pour enfin arriver à la conclusion que c’est un bug de PHP.

Dans ce cas, une seule solution, la mise à jour. J’ai donc décider de mettre à jour Apache en compilant la nouvelle version moi-même, idem pour PHP, que j’ai compiler. Je suis passé à Apache 2.2.13 avec PHP 5.2.10 pur. C’est parfait, ça marche ! :)

facebooktwittergoogle_plusredditpinterestlinkedinmail