Contrôle de processus pcntl de PHP pcntl_fork

不言
Libérer: 2023-04-02 18:48:01
original
2469 Les gens l'ont consulté

Cet article présente principalement pcntl_fork sur le contrôle de processus pcntl de PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Introduction à pcntl

PHP. la prise en charge du contrôle de processus implémente la création de processus de style Unix, l'exécution de programme, le traitement du signal et l'interruption de processus. Le contrôle de processus ne peut pas être utilisé dans un environnement de serveur Web et peut entraîner des résultats inattendus lorsqu'il est utilisé dans un environnement de serveur Web.

Ce document explique l'utilisation courante de chaque fonction de contrôle de processus. Pour plus d'informations sur le contrôle de processus Unix, il est recommandé de consulter la documentation système sur fork(2), waitpid(2), signal(2), etc. ou des documents de référence plus complets tels que "Programmation avancée dans un environnement Unix" ( auteur : W. Richard Stevens, Addison-Wesley).

PCNTL utilise désormais les ticks comme mécanisme de rappel pour le traitement du signal. La vitesse des ticks dépasse de loin le mécanisme de traitement précédent. Ce changement suit la même sémantique que les « ticks utilisateur ». Vous pouvez utiliser l'instruction declare() pour spécifier où les rappels sont autorisés à se produire dans votre programme. Cela nous permet de minimiser la surcharge liée à la gestion des événements asynchrones. L'activation de pcntl lors de la compilation de PHP entraînera toujours cette surcharge, que pcntl soit réellement utilisé dans votre script ou non.

Une modification est que tous les scripts pcntl antérieurs à PHP 4.3.0 pour le faire fonctionner, utilisent declare() dans la partie (du code) où les rappels devraient être autorisés, ou utilisent la nouvelle syntaxe globale de declare() pour le faire fonctionner Valable tout au long du script.

Remarque : Cette extension n'est pas disponible sur la plateforme Windows.

Document officiel

Document officiel pcntl

pcntl_fork

# 来源官方

PHP 4 >= 4.1.0, PHP 5, PHP 7)

pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。

说明
int pcntl_fork ( void )
pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。

返回值
成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
Copier après la connexion

Code

<?php
/**
 * Created by PhpStorm.
 * User: Object
 * Date: 2018/6/11
 * Time: 10:12
 */

const NEWLINE = "\n\n";

if (strtolower(php_sapi_name()) != &#39;cli&#39;) {
    die("请在cli模式下运行");
}

echo "当前进程:" . getmypid() . NEWLINE;

$pid = pcntl_fork(); //fork出子进程

//fork后父进程会走自己的逻辑,子进程从处开始走自己的逻辑,堆栈信息会完全复制给子进程内存空间,父子进程相互独立

if ($pid == -1) { // 创建错误,返回-1

    die(&#39;进程fork失败&#39;);

} else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id

    // 父进程逻辑
    $time = microtime(true);
    echo "我是父进程:{$time}".NEWLINE;

} else { // $pid = 0

    // 子进程逻辑
    $time = microtime(true);
    echo "我是子进程:{$time}".NEWLINE;
}
Copier après la connexion

Résultat de l'exécution

当前进程:17472

我是父进程:1528697500.2961

我是子进程:1528697500.2961
Copier après la connexion
Copier après la connexion

Après le fork, le processus enfant exécutera-t-il la logique en premier ou le processus parent ?

Code de test

Ici, nous modifions l'ordre if des processus parent et enfant dans le code ci-dessus
if ($pid == -1) { // 创建错误,返回-1

    die(&#39;进程fork失败&#39;);

} else if (!$pid) { // $pid = 0

    // 子进程逻辑
    $time = microtime(true);
    echo "我是子进程:{$time}".NEWLINE;
} else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id

    // 父进程逻辑
    $time = microtime(true);
    echo "我是父进程:{$time}".NEWLINE;

}
Copier après la connexion

Résultats de l'exécution

当前进程:17472

我是父进程:1528697500.2961

我是子进程:1528697500.2961
Copier après la connexion
Copier après la connexion

Résumé du test

Fork exécutera d'abord la logique du processus parent, puis la logique du processus enfant

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. Pour en savoir plus. contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

PHP utilise la réflexion pour obtenir des classes et certaines applications de base

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!