>  기사  >  백엔드 개발  >  PHP의 pcntl 프로세스 제어 pcntl_fork

PHP의 pcntl 프로세스 제어 pcntl_fork

不言
不言원래의
2018-07-06 17:40:242484검색

이 글은 주로 PHP의 pcntl 프로세스 제어에 대한 pcntl_fork를 소개하고 있습니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.

pcntl 소개#🎜🎜 ## 🎜🎜#PHP의 프로세스 제어 지원은 Unix 스타일 프로세스 생성, 프로그램 실행, 신호 처리 및 프로세스 중단을 구현합니다. 프로세스 제어는 웹 서버 환경에서는 사용할 수 없으며, 웹 서비스 환경에서 사용할 경우 예상치 못한 결과가 발생할 수 있습니다.

이 문서는 각 공정 제어 기능의 일반적인 사용법을 설명하는 데 사용됩니다. Unix 프로세스 제어에 대한 자세한 내용은 fork(2), waitpid(2), signal(2) 등에 관한 시스템 설명서를 참조하거나 "Unix 환경의 고급 프로그래밍"( 저자: W. Richard Stevens, Addison-Wesley).

PCNTL은 이제 신호 처리를 위한 콜백 메커니즘으로 틱을 사용합니다. 틱의 속도는 이전 처리 메커니즘을 훨씬 뛰어넘습니다. 이 변경은 "사용자 틱"과 동일한 의미를 따릅니다. 선언() 문을 사용하여 프로그램에서 콜백이 발생할 수 있는 위치를 지정할 수 있습니다. 이를 통해 비동기 이벤트 처리의 오버헤드를 최소화할 수 있습니다. PHP를 컴파일할 때 pcntl을 활성화하면 pcntl이 실제로 스크립트에서 사용되는지 여부에 관계없이 항상 이러한 오버헤드가 발생합니다.

한 가지 변경 사항은 PHP 4.3.0 이전의 모든 pcntl 스크립트가 작동하도록 하려면 콜백이 허용될 것으로 예상되는 부분(코드)에서 선언()을 사용하거나 새로운 스크립트를 사용한다는 것입니다. 선언()의 전역 구문을 스크립트 전체에서 유효하게 만드세요.

참고: 이 확장 프로그램은 Windows 플랫폼에서 사용할 수 없습니다.

공식 문서

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错误。

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;
}
#🎜 🎜#실행 결과

当前进程:17472

我是父进程:1528697500.2961

我是子进程:1528697500.2961

포크 후 하위 프로세스가 로직을 먼저 실행합니까, 아니면 상위 프로세스가 로직을 먼저 실행합니까?

테스트 코드

여기서 위 코드에서 상위 및 하위 프로세스의 if 순서를 변경합니다

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;

}

실행 결과
当前进程:17472

我是父进程:1528697500.2961

我是子进程:1528697500.2961
테스트 요약

fork는 먼저 상위 프로세스 로직을 실행한 다음 하위 프로세스 로직을 실행합니다

위 내용이 이 글의 전체 내용입니다. 모두의 학습에 도움이 될 것입니다. 더 많은 관련 콘텐츠가 있습니다. PHP 중국어 웹사이트를 주목해주세요!
관련 권장사항:

PHP는 리플렉션을 사용하여 클래스와 일부 기본 애플리케이션을 가져옵니다.

# 🎜🎜#php는 공유 메모리 프로세스 통신 기능(_shm)을 구현합니다.(_shm)

위 내용은 PHP의 pcntl 프로세스 제어 pcntl_fork의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.