我想尝试使用 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()
,还是我遗漏了什么?
我认为使用
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() 一样。