Position actuelle: Accueil> Derniers articles> Comment utiliser proc_terminate pour coopérer avec Stream_get_Connts pour obtenir la sortie du processus d'enfant?

Comment utiliser proc_terminate pour coopérer avec Stream_get_Connts pour obtenir la sortie du processus d'enfant?

gitbox 2025-06-09

1. Qu'est-ce que ProC_Open ?

PROC_OPEN est une fonction de PHP qui nous permet de démarrer un processus et d'interagir avec elle. Il vous permet de lire la sortie d'un processus enfant, d'écrire une entrée et même d'obtenir la sortie d'erreur du processus. Contrairement à EXEC ou SHARP_EXEC , ProC_Open peut fournir des fonctions de contrôle plus puissantes.

2. Comment utiliser ProC_Open pour démarrer un processus enfant?

Tout d'abord, nous devons utiliser ProC_Open pour démarrer un processus enfant. Le premier paramètre de Proc_Open est la chaîne de commande, le deuxième paramètre est la configuration du pipeline et le troisième paramètre est le tableau utilisé pour recevoir la sortie et les erreurs du processus de l'enfant.

Voici un exemple simple:

 $cmd = "ls -l";  // Vous pouvez le remplacer par n'importe quelle commande
$descriptorspec = [
    1 => ['pipe', 'w'],  // Sortie standard
    2 => ['pipe', 'w'],  // Erreur standard
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // Lire la sortie du processus enfant
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // 读取Erreur standard(S'il y a)
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    // Fermez le processus
    $exit_code = proc_close($process);

    echo "Output:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }
    echo "Exit Code: " . $exit_code . "\n";
}

Dans cet exemple, nous commençons la commande ls -l et utilisons Stream_get_Contents pour lire sa sortie standard et ses erreurs standard. Proc_open nous permet d'interagir avec le processus pendant l'exécution, tandis que Stream_get_Contents est utilisé pour obtenir le contenu dans le flux de sortie.


3. Utilisez Proc_terminer pour mettre fin au processus enfant

Dans certains cas, il peut être nécessaire de forcer le processus de l'enfant à se terminer, surtout si le processus de l'enfant fonctionne trop longtemps ou est coincé. La fonction proc_terminate peut être utilisée pour mettre fin à un processus d'enfant en cours d'exécution.

Voici un exemple de fin d'un processus à l'aide de proc_termiate :

 $cmd = "sleep 10";  // Laissez le processus dormir10Deuxième,Pour simuler un processus de longue date
$descriptorspec = [
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w'],
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // 等待几Deuxième钟后终止子进程
    sleep(3);
    proc_terminate($process);  // Terminaison forcée du processus

    // Lire la sortie et les erreurs
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    echo "Output after termination:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }

    // Obtenez le code de sortie du processus
    $exit_code = proc_close($process);
    echo "Exit Code: " . $exit_code . "\n";
}

Dans cet exemple, nous avons simulé un long processus en cours d'exécution en utilisant Sleep 10 , puis terminé le processus avec Proc_Terminate après 3 secondes. Notez qu'après terminer le processus, nous pouvons toujours obtenir les informations de sortie et d'erreur du processus de l'enfant.


4. Exemple complet: comment obtenir la sortie et les erreurs du processus de l'enfant en même temps et contrôler le processus?

En combinant le contenu précédent, voici un exemple complet montrant comment démarrer un processus, obtenir une sortie, une erreur d'erreur et terminer le processus si nécessaire.

 $cmd = "ping -c 4 google.com";  // Commandes de test,ping Google
$descriptorspec = [
    1 => ['pipe', 'w'],  // Sortie standard
    2 => ['pipe', 'w'],  // Erreur standard
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // Lisez la sortie du processus
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // 读取Erreur standard输出
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    // Fermez le processus并获取退出代码
    $exit_code = proc_close($process);

    echo "Output:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }

    echo "Exit Code: " . $exit_code . "\n";
}

Dans cet exemple, nous utilisons la commande ping pour tester une connexion réseau et démarrer le processus via ProC_Open pour lire les informations de sortie et d'erreur.