Position actuelle: Accueil> Derniers articles> Comment ouvrir le flux d'entrée et de sortie d'un processus via POPEN et interagir avec les données?

Comment ouvrir le flux d'entrée et de sortie d'un processus via POPEN et interagir avec les données?

M66 2025-07-07

Dans PHP, Popen est une fonction très utile qui peut être utilisée pour ouvrir les flux d'entrée et de sortie d'un processus afin que vous puissiez interagir avec les données du processus. Cette fonctionnalité est souvent utile lorsque vous devez exécuter des commandes externes et obtenir leur sortie, telles que l'appel des programmes externes, l'exécution de scripts ou l'interaction avec d'autres systèmes.

Qu'est-ce qu'une fonction POPEN ?

La fonction POPEN est utilisée pour ouvrir un processus et renvoyer un pointeur de fichier vers le flux d'entrée ou de sortie du processus. Cette fonction a deux paramètres:

 resource popen(string $command, string $mode);
  • $ Command : La commande à exécuter est généralement une commande shell.

  • MODE $ : Mode d'opération, R représente le mode de lecture, W représente le mode d'écriture et R + représente le mode de lecture et d'écriture.

Par exemple:

 $handle = popen("ls -l", "r");

Le code ci-dessus ouvrira un processus, exécutera la commande ls -l et vous permettra de lire la sortie du processus.

Comment interagir avec les processus via Popen ?

La valeur de retour de POPEN est un pointeur de fichiers qui vous permet de lire ou d'écrire des données comme un fichier. Lorsque vous interagissez avec un processus, nous devons généralement utiliser Fread ou Fgets pour lire les données du flux de sortie du processus, ou utiliser FWrite pour écrire des données dans le flux d'entrée du processus.

1. Lire les données du processus

Supposons que nous voulons obtenir des données à partir d'une commande externe et la traiter, l'exemple de code est le suivant:

 $handle = popen("ls -l", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "Impossible d'ouvrir le processus";
}

Ici, nous parcourons FGETS pour lire chaque ligne de la sortie du processus jusqu'à ce qu'il n'y ait plus de sortie.

2. Écrivez des données au processus

Si vous avez besoin d'écrire des données sur un flux d'entrée standard d'un processus, vous pouvez le faire via le mode W de Popen :

 $handle = popen("sort", "w");
if ($handle) {
    fwrite($handle, "banana\napple\ncherry\n");
    fclose($handle);
} else {
    echo "Impossible d'ouvrir le processus";
}

Le code ci-dessus démarre la commande de tri et écrit des données dans son flux d'entrée standard. Le tri triera ces données.

3. Lire et écrire des données

Si vous avez besoin de lire et d'écrire des données en même temps, vous pouvez utiliser le mode R + . Cette approche convient aux situations où une communication bidirectionnelle avec les processus est requise.

 $handle = popen("tee /tmp/output.txt", "r+");
if ($handle) {
    fwrite($handle, "Hello, world!\n");
    fflush($handle);  // Assurez-vous que les données sont écrites
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "Impossible d'ouvrir le processus";
}

Dans cet exemple, nous écrivons des données sur /tmp/output.txt via la commande TEE et lions les données à partir de la sortie du processus.

Utilisez POPEN pour faire des demandes de réseau

Parfois, nous pouvons avoir besoin d'exécuter des commandes liées au réseau via POPEN . Nous pouvons demander des ressources distantes via des outils de ligne de commande tels que Curl ou WGET . Voici un exemple montrant comment obtenir une page Web via Curl :

 $handle = popen("curl -s http://m66.net", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "Impossible d'ouvrir le processus";
}

Le code ci-dessus demande http://m66.net via Curl et publie le contenu renvoyé ligne par ligne.

Choses à noter

  1. Cycle de vie du processus : le processus démarré par POPEN sera automatiquement fermé après l'exécution du script PHP. Pour garantir la version correcte des ressources, Fclose doit être appelé avant la fin du script pour fermer le pointeur de fichier.

  2. Sécurité : soyez prudent lorsque vous utilisez POPEN . Assurez-vous que les commandes ou paramètres entrants ne seront pas manipulés par des utilisateurs malveillants et essayez d'éviter directement d'utiliser la saisie des utilisateurs dans le cadre de la commande.

  3. Performances : Bien que POPEN puisse faciliter la communication interprète, le démarrage fréquent de processus externes peut avoir un impact sur les performances, en particulier lorsqu'il s'agit de grandes quantités de données.

Résumer

Popen est un outil puissant de PHP qui vous permet d'interagir avec les processus externes et d'obtenir leur sortie ou leurs données d'entrée. En utilisant différents modes, vous pouvez lire, écrire et même effectuer des opérations d'entrée et de sortie simultanément. Dans les applications pratiques, il est particulièrement adapté à l'exécution de commandes externes, à faire des demandes de réseau et à communiquer avec d'autres programmes.