如何用原生PHP实现多进程(pcntl_fork、pcntl_wait、pcntl_waitpid用法详解 )

文 / @UTHEME

PHP 提供了一组函数,可以使用它们在 PHP 中实现多进程。本文将讲解一下使用它们实现多进程。

70304292917ac0f832cadbae37cc12c6

pcntl_fork函数的用法

要创建新的进程,您可以使用 pcntl_fork() 函数。该函数将在当前进程中复制一个新进程,并返回新进程的进程 ID。您可以使用该函数来递归创建多个进程。

在父进程中,pcntl_fork() 函数将返回新进程的进程 ID,而在子进程中,它将返回 0。因此,您可以使用此返回值来区分父进程和子进程,并在进程之间进行通信。

例如,以下代码演示了如何使用 pcntl_fork() 函数创建两个新进程:

$pid = pcntl_fork();
if ($pid == -1) {
// Error
exit;
} elseif ($pid) {
// Parent process
echo "I'm the parent process.\n";
} else {
// Child process
echo "I'm the child process.\n";
}
$pid = pcntl_fork();
if ($pid == -1) {
// Error
exit;
} elseif ($pid) {
// Parent process
echo "I'm the parent process.\n";
} else {
// Child process
echo "I'm the child process.\n";
}

在上面的代码中,将创建两个新进程,并且每个进程都将打印一条消息,以示区别。

还有许多其他的函数,可以用于实现多进程编程,例如 pcntl_waitpid()pcntl_signal()。有关详细信息,请参阅 PHP 文档:https://www.php.net/

 

pcntl_wait函数的用法

pcntl_wait() 函数是 PHP 中用于等待子进程终止的函数。它允许父进程在等待子进程终止时阻塞,直到子进程完成为止。

该函数的语法如下:

pcntl_wait(&$status, $options);

其中:

  • $status:是一个整数,将被设置为子进程的终止状态。
  • $options:是一个整数,表示函数的选项。可以使用的选项包括 WNOHANGWUNTRACED

例如,以下代码演示了如何使用 pcntl_wait() 函数等待子进程终止:

$pid = pcntl_fork();
if ($pid == -1) {
// Error
exit;
} elseif ($pid) {
// Parent process
pcntl_wait($status);
echo "Child process has completed.\n";
} else {
// Child process
sleep(10);
exit;
}

在上面的代码中,父进程将通过调用 pcntl_wait() 函数阻塞,直到子进程终止。然后,将打印“Child process has completed.”。

注意,如果使用 pcntl_wait() 函数,则必须在父进程中调用它。否则,将出现错误。

pcntl_waitpid函数的用法

pcntl_waitpid() 函数是 PHP 中用于等待指定的子进程终止的函数。它允许父进程在等待子进程终止时阻塞,直到子进程完成为止。

该函数的语法如下:

pcntl_waitpid($pid, &$status, $options);

其中:

  • $pid:是一个整数,表示要等待的子进程的进程 ID。
  • $status:是一个整数,将被设置为子进程的终止状态。
  • $options:是一个整数,表示函数的选项。可以使用的选项包括 WNOHANGWUNTRACED

例如,以下代码演示了如何使用 pcntl_waitpid() 函数等待指定的子进程终止:

$pid1 = pcntl_fork();
if ($pid1 == -1) {
// Error
exit;
} elseif ($pid1) {
// Parent process
} else {
// Child process 1
sleep(10);
exit;
}
$pid2 = pcntl_fork();
if ($pid2 == -1) {
// Error
exit;
} elseif ($pid2) {
// Parent process
pcntl_waitpid($pid1, $status);
echo "Child process 1 has completed.\n";
pcntl_waitpid($pid2, $status);
echo "Child process 2 has completed.\n";
} else {
// Child process 2
sleep(5);
exit;
}

在上面的代码中,父进程将调用 pcntl_waitpid() 函数两次,等待两个子进程终止。第一次调用将等待子进程 1 终止,第二次调用将等待子进程 2 终止。

注意,如果使用 pcntl_waitpid() 函数,则必须在父进程中调用它。否则,将出现错误。

此外,如果要等待所有子进程终止,则可以将进程 ID 设置为 -1。例如:

pcntl_waitpid(-1, $status, $options);

还可以使用 pcntl_wexitstatus() 函数来检索子进程的退出状态。例如:

$exitStatus = pcntl_wexitstatus($status);

 

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。