如何使用PHP pcntl_rfork?

问题描述 投票:0回答:1

我想尝试使用 pcntl_rfork 来操作 PHP 8.3 中的进程资源。我启用了 PCNTL 扩展,但是当我尝试运行以下代码时,出现错误:

致命错误:未捕获错误:调用未定义的函数 pcntl_rfork()

这是我正在使用的代码:

<?php

$pid = pcntl_rfork(RFNOWAIT|RFTSIGZMB, SIGUSR1);
if ($pid > 0) {
    // This is the parent process.
    var_dump($pid);
} else {
    // This is the child process.
    var_dump($pid);
    sleep(2); // as the child does not wait, so we see its "pid"
}
?>

我使用

pcntl_fork()
没有任何问题,但我似乎无法让
pcntl_rfork()
工作。根据文档,它应该从 php 8.1 开始可用,这让我想知道为什么这个函数不起作用。

有人可以解释为什么会发生这个错误吗? PHP 8.3 支持

pcntl_rfork()
,还是我遗漏了什么?

php fork pcntl
1个回答
0
投票

我认为使用

pcntl_fork()
共享内存来控制 PHP 进程之间的资源共享。

  • pcntl_fork()
    :将父进程分叉为两个独立的进程(父进程和子进程)。
  • 共享内存 (
    shmop
    )
    :允许两个进程通过写入和读取同一内存块来共享数据。
// Create a System V IPC key for shared memory
$key = ftok(__FILE__, 'a');

// Create a shared memory block with the given key
$shmId = shmop_open($key, "c", 0644, 100);
if (!$shmId) {
    die("Failed to create shared memory block");
}

// Fork the process
$pid = pcntl_fork();

if ($pid == -1) {
    // If forking fails
    die("Could not fork the process");
} elseif ($pid) {
    // Parent process
    $parentMessage = "Message from parent process";

    // Write the message to shared memory
    shmop_write($shmId, $parentMessage, 0);

    // Wait for the child process to complete
    pcntl_wait($status);

    // Read the modified message from shared memory after child writes
    $parentRead = shmop_read($shmId, 0, 100);
    echo "Parent read from shared memory: $parentRead\n";

    // Clean up shared memory
    shmop_delete($shmId);
    shmop_close($shmId);

} else {
    // Child process
    sleep(1); // Let parent write first

    // Read the message from shared memory
    $childRead = shmop_read($shmId, 0, 100);
    echo "Child read from shared memory: $childRead\n";

    // Modify the message in shared memory
    $childMessage = "Message from child process";
    shmop_write($shmId, $childMessage, 0);

    // Close shared memory in child process
    shmop_close($shmId);

    // Exit the child process
    exit(0);
}

我刚刚运行这个程序

子进程从共享内存中读取:来自父进程的消息 父进程从共享内存中读取:来自子进程的消息

这种方法允许进程间通信(IPC),模仿您想要的资源共享功能,就像其他环境中的 rfork() 一样。

© www.soinside.com 2019 - 2024. All rights reserved.