Maison  >  Article  >  développement back-end  >  Il existe plusieurs façons de communiquer entre les processus php

Il existe plusieurs façons de communiquer entre les processus php

(*-*)浩
(*-*)浩original
2019-09-25 10:03:083018parcourir

Il existe plusieurs façons pour PHP de communiquer entre les processus : pipe (Pipe) et tube nommé (named pipe), signal (Signal), file d'attente de messages (Message) (file d'attente de messages), mémoire partagée, signal Sémaphore, Douille.

Il existe plusieurs façons de communiquer entre les processus php

Cet article répertorie une façon de le présenter, c'est-à-dire via des chaînes célèbres.

Les pipelines sont utilisés pour transporter des données de communication entre les abréviations. Pour faciliter la compréhension, un canal peut être comparé à un fichier. Le processus A écrit des données dans le canal P, puis le processus B lit les données dans le canal P.

L'API d'opération de pipeline fournie par php est fondamentalement la même que l'API d'exploitation de fichiers, sauf que la fonction posix_mkfifo est utilisée pour créer un pipeline, les opérations de lecture et d'écriture sont les mêmes que les fonctions d'opération de fichier.

Bien sûr, vous pouvez utiliser directement des fichiers pour simuler des pipelines, mais vous ne pourrez pas utiliser les fonctionnalités des pipelines.

L'idée générale de la communication via un tube est de créer d'abord un tube, puis le processus enfant écrit les informations dans le tube et le processus parent lit les informations du tube. et les processus enfants peuvent communiquer directement.

<?php
/**
 * author: NickBai
 * createTime: 2016/12/2 0002 上午 11:12
 */
//创建管道
$pipePath = "/tmp/test.pipe";
if( !file_exists( $pipePath ) ){
    if( !posix_mkfifo( $pipePath, 0666 ) ){
        exit(&#39;make pipe false!&#39; . PHP_EOL);
    }
}
//创建进程,子进程写管道,父进程读管道
$pid = pcntl_fork();
if( $pid == 0 ){
    //子进程写管道
    $file = fopen( $pipePath, &#39;w&#39; );
    fwrite( $file, &#39;hello world&#39; );
    sleep(1);
    exit();
}else{
    //父进程读管道
    $file = fopen( $pipePath, &#39;r&#39; );
    //stream_set_blocking( $file, False );  //设置成读取非阻塞
    echo fread( $file, 20 ) . PHP_EOL;
    pcntl_wait($status);  //回收子进程
}

Remarque : Ce code ne peut être exécuté que sous Linux et uniquement en mode php-cli.

Ligne 7 : Spécifiez le chemin d'un pipeline, qui n'est pas différent d'un fichier ordinaire.

Ligne 9 : Créez un canal via la fonction posix_mkfifo et définissez les autorisations de lecture et d'écriture sur 0666

Ligne 15 : Créez un processus enfant via la fonction pcntl_fork. Notez qu'à partir de maintenant, le programme sera divisé en deux processus d'exécution. La fonction pcntl_fork est très spéciale. Elle a plusieurs valeurs de retour une fois appelée. Dans le processus parent : il renvoie l'ID du processus enfant. Cette valeur est supérieure à 0. Dans le processus enfant, il renvoie 0. Lorsque -1 est renvoyé, cela indique que le processus de création a échoué.

Ligne 17 : Les deux processus entrent dans des branches différentes en fonction des différentes valeurs $pid obtenues par le processus actuel.

Lignes 18 à 22 : Le processus enfant ouvre le tube, y écrit hello world, puis entre en veille et sort une fois le sommeil terminé.

Ligne 25~29 : Le processus parent ouvre le tube et le lit, et exécute enfin le code de la ligne 29 pour recycler le processus enfant. Il y a deux endroits ici qui sont bloqués. Le premier est l'endroit de lecture par défaut. Vous devez attendre que le processus enfant émette une commande de sortie avant de pouvoir renvoyer les données. Il existe également la méthode pcntl_wait pour recycler le processus. Attendez que le processus se termine.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn