php ipc实现
PHP 进程间通信(IPC)实现方法
PHP 提供了多种进程间通信(IPC)的方式,适用于不同场景的需求。以下是常见的实现方法:
共享内存(Shared Memory)
使用 shmop 或 sysvshm 扩展可以实现共享内存。shmop 是更现代的扩展,推荐使用。
// 创建或打开共享内存块
$shmKey = ftok(__FILE__, 't');
$shmId = shmop_open($shmKey, "c", 0644, 100);
// 写入数据
$data = "Hello, Shared Memory!";
shmop_write($shmId, $data, 0);
// 读取数据
$readData = shmop_read($shmId, 0, shmop_size($shmId));
echo $readData;
// 关闭和删除共享内存
shmop_close($shmId);
shmop_delete($shmId);
信号量(Semaphores)
用于进程同步,防止资源竞争。

$semKey = ftok(__FILE__, 's');
$semId = sem_get($semKey);
// 获取信号量
sem_acquire($semId);
// 临界区代码
// ...
// 释放信号量
sem_release($semId);
消息队列(Message Queues)
使用 sysvmsg 扩展实现进程间的消息传递。
$msgKey = ftok(__FILE__, 'q');
$queue = msg_get_queue($msgKey, 0666);
// 发送消息
$message = [
'type' => 1,
'text' => 'Hello, Message Queue!'
];
msg_send($queue, $message['type'], $message);
// 接收消息
msg_receive($queue, 1, $msgType, 1024, $receivedMessage);
print_r($receivedMessage);
管道(Pipes)
匿名管道用于父子进程通信,命名管道可用于任意进程通信。

// 匿名管道示例
$pipe = popen('php child_process.php', 'w');
fwrite($pipe, "Hello, Pipe!\n");
pclose($pipe);
// 命名管道示例
$fifoPath = '/tmp/myfifo';
posix_mkfifo($fifoPath, 0666);
$fifo = fopen($fifoPath, 'w');
fwrite($fifo, "Hello, Named Pipe!\n");
fclose($fifo);
套接字(Sockets)
TCP/IP 或 Unix 域套接字可以实现本地或远程进程通信。
// Unix 域套接字示例
$socketPath = '/tmp/ipc.sock';
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($socket, $socketPath);
socket_listen($socket);
// 客户端连接
$client = socket_accept($socket);
socket_write($client, "Hello, Socket!\n");
socket_close($client);
socket_close($socket);
文件锁(File Locks)
通过文件锁实现简单的进程同步。
$fp = fopen('/tmp/lockfile', 'w');
// 获取排他锁
flock($fp, LOCK_EX);
// 临界区代码
// ...
// 释放锁
flock($fp, LOCK_UN);
fclose($fp);
选择建议
- 需要高性能共享数据:使用共享内存
- 需要进程同步:使用信号量或文件锁
- 需要消息传递:使用消息队列或套接字
- 简单临时通信:使用管道
每种方法都有其适用场景,应根据具体需求选择最合适的 IPC 方式。






