Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/06/2017, à 11:43

RaymondTada61

Call to undefined function pcntl_signal()

Bonjour,

Je voudrais utiliser les "signaux" en PHP, et, plus exactement, pouvoir récupérer le SIGINT pour pouvoir interrompre une boucle.
Le problème est que je me heurte systématiquement à ce fichu message d'erreur : "Call to undefined function pcntl_signal()", dès que je veux utiliser les "signaux".
Sur les différents forums on trouve deux explications possibles : soit une version de PHP trop ancienne, soit un php.ini mal configuré.

Pour ce qui est des versions, voici ma config :
- ubuntu 16.04
- PHP 7.0.18
- Apache 2.4.18
- MySql 5.7.18

Donc je ne pense pas avoir une version de PHP trop ancienne.

La commande php -i | grep pcntl me renvoie :
pcntl
pcntl support => enabled

Dans mon fichier php.ini (ligne 299) j'ai mis en ligne 300 et en commentaire toutes les fonctions "pcntl_*" de façon à ne laisser que "disable_functions = ".

Donc je ne pense pas avoir un php.ini mal configuré.

Mon code de test est d'une rare simplicité :

<?php

declare(ticks = 1);

# gestionnaire de signaux système
function sig_handler($signo)
{

     switch ($signo) {
         case SIGINT:
              echo "CTRL-C : Exit !!!\n";
             exit;
             break;
         case SIGHUP:
             break;
         case SIGUSR1:
             echo "Reçu le signal SIGUSR1...\n";
             break;
         default:
             echo "Signal ".$signo." reçu : non traité.\n";
     }

}

echo "Installation du gestionnaire de signaux...\n";

# Installation des gestionnaires de signaux
pcntl_signal(SIGINT,  "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

echo "Fait.\n";

for($i=0; $i<12; $i++) {
    pcntl_signal_dispatch();
    echo "Tour de boucle n° ".$i.", je vais me reposer un peu...\n";
    sleep(5);
}

?>

Malgré tout, je me mange des "Call to undefined function pcntl_signal()" dès que je veux tester ce code...

Quelqu'un aurait une idée ???

Hors ligne

#2 Le 21/06/2017, à 13:07

bruno

Re : Call to undefined function pcntl_signal()

Bonjour,

Un peu de lecture : http://php.net/manual/fr/intro.pcntl.php

Le système de contrôle des processus de PHP implémente un système de création, gestion et terminaison des processus comme sous Unix. Cette extension ne doit pas être activée pour une utilisation en serveur web, car les résultats pourraient être inattendus.

Pour la plupart des distributions Linux le module PHP d'apache est compilé sans la prise en charge de Pcntl, et c'est une bonne chose ! Par contre ces fonctions devraient être utilisables en ligne de commande (php cli).

Hors ligne

#3 Le 21/06/2017, à 13:12

J5012

Re : Call to undefined function pcntl_signal()

selon la definition de pcntl_signal : http://php.net/manual/en/function.pcntl-signal.php
et l'exemple : https://stackoverflow.com/questions/230 … s#23158960

pcntl_signal doit appeler des variables ... l'appel à partir d'une fonction suppose une initialisation supplementaire qui n'est pas disponible dans tous les materiels ...

Hors ligne

#4 Le 21/06/2017, à 15:23

RaymondTada61

Re : Call to undefined function pcntl_signal()

Re,

Effectivement, en ligne de commande, cela fonctionne, mais cela ne présente aucun intérêt dans mon cas.

Existe-t-il une distribution linux dans laquelle le module PHP d'Apache serait compilé avec la prise en charge de Pcntl ?

Si oui, laquelle ?

Si non, comment peut-on compiler le module PHP d'Apache avec la prise en charge de Pcntl ?

Je comprends tout à fait la raison pour laquelle "Cette extension ne doit pas être activée pour une utilisation en serveur web", toutefois, dans mon cas, l'utilisation ne serait que locale, donc sans grand risque en terme de sécurité. De plus, "ne doit pas" laisse supposer qu'on doit pouvoir forcer ce type d'utilisation.

En tout cas, merci pour vos réponses. wink

Hors ligne

#5 Le 21/06/2017, à 16:15

bruno

Re : Call to undefined function pcntl_signal()

Je ne suis même pas sûr que l'on puisse utiliser cela avec le module PHP d'apache. Le risque ne se pose pas seulement en terme de sécurité. Avec le module PHP d'Apache les scripts sont exécutés par Apache lui-même. Envoyer des signaux directement au processus risque donc tout simplement de planter Apache ou au mieux de générer des processus zombies…

Cela fonctionne peut-être avec le mode fcgi ou php-fpm qui permettent d'exécuter des scripts PHP sous leur propre utilisateur indépendamment d'Apache, mais je n'en sait pas plus.

Hors ligne

#6 Le 21/06/2017, à 18:56

RaymondTada61

Re : Call to undefined function pcntl_signal()

Hum... Je me suis lancé à la conquête de "libevent" et "event", j'ai installé tout un tas de truc avec du pecl, j'ai modifié mon php.ini avec "extension=event.so", etc...

Résultat : j'obtiens exactement la même erreur mais cette fois avec "event_base_new()" et "event_new()"...

Mon objectif est de pouvoir interrompre une boucle en php, si possible avec un événement du type "une touche du clavier a été enfoncée" (ou un "clic" sur la souris, ou n'importe quelle action que peut faire un utilisateur).

Si quelqu'un a une idée, je suis preneur...

Hors ligne

#7 Le 21/06/2017, à 19:20

bruno

Re : Call to undefined function pcntl_signal()

Bon, tu devrais poster dans la section "Développement et programmation". Il faudra y expliquer précisément ce que tu veux faire. Si tes scripts PHP génèrent des pages web, tu ne peux pas capturer les événements de clavier/souris. Dans ce cas il faut utiliser Javascript avec des requêtes Ajax. De toute façon libevent ne sert pas à cela…

Hors ligne

#8 Le 23/06/2017, à 11:29

RaymondTada61

Re : Call to undefined function pcntl_signal()

Bonjour,

  Pour "libevent", j'avais espoir de pouvoir m'en sortir en utilisant STDIN comme file descriptor, malheureusement, "libevent" fonctionne aussi bien que les fonctions "pcntl_*"...

  Sinon tu as raison, je vais me rabattre sur du Javascript pour capter l'événement. Le truc c'est que j'utilise déjà une requête Ajax pour lancer ma boucle en PHP, donc, lancer une seconde requête Ajax ne devrait pas être un problème, en revanche, la faire communiquer avec le premier processus (ma boucle en PHP) risque d'être aussi amusant que de vouloir utiliser "libevent" ou les fonctions "pcntl_*".

  Après, il reste toujours la solution super moche de créer un fichier bidon lorsque l'événement est capté, et, dans ma boucle, vérifier l'existence ou non de ce fichier bidon pour interrompre ou non la boucle.

  C'est vraiment dommage de ne pas pouvoir utiliser les signaux en PHP : j'aurais vraiment aimé avoir la solution, mais bon, tant pis.

Merci quand même pour les infos. smile

Hors ligne