php ipc实现
PHP IPC 实现方法
PHP 提供了多种进程间通信(IPC)机制,适用于不同场景的需求。以下是常见的实现方式:
共享内存(Shared Memory)
使用 shmop 或 sysvshm 扩展可以实现共享内存通信。适用于高速数据交换。
// 创建共享内存块
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "c", 0644, 100);
// 写入数据
$data = "Hello IPC";
shmop_write($shm_id, $data, 0);
// 读取数据
$data = shmop_read($shm_id, 0, shmop_size($shm_id));
消息队列(Message Queues)
通过 sysvmsg 扩展实现进程间的消息传递。
// 创建消息队列
$msg_key = ftok(__FILE__, 'm');
$msg_id = msg_get_queue($msg_key, 0666);
// 发送消息
$message = ['type' => 1, 'text' => 'Test message'];
msg_send($msg_id, $message['type'], $message);
// 接收消息
msg_receive($msg_id, 0, $msgtype, 1024, $message, true);
信号量(Semaphores)
用于进程同步,防止资源竞争。
$sem_key = ftok(__FILE__, 's');
$sem_id = sem_get($sem_key);
// 获取信号量
sem_acquire($sem_id);
// 释放信号量
sem_release($sem_id);
文件锁(File Locking)
通过文件系统实现简单的进程同步。
$fp = fopen("/tmp/lock.txt", "w+");
// 获取排他锁
if (flock($fp, LOCK_EX)) {
// 临界区操作
flock($fp, LOCK_UN);
}
fclose($fp);
套接字(Sockets)
适用于本地或跨网络进程通信。
// 服务端
$sock = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($sock, '/tmp/php.sock');
socket_listen($sock);
// 客户端
$client = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($client, '/tmp/php.sock');
管道(Pipes)
通过 proc_open 创建进程管道通信。
$descriptors = [
0 => ['pipe', 'r'], // stdin
1 => ['pipe', 'w'], // stdout
];
$process = proc_open('php worker.php', $descriptors, $pipes);
fwrite($pipes[0], "input data");
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
proc_close($process);
选择建议
- 需要高性能数据共享时选择共享内存
- 需要异步消息处理时选择消息队列
- 需要进程同步时选择信号量或文件锁
- 需要灵活通信时选择套接字或管道
不同方法可以组合使用以满足复杂场景需求。实现时需注意资源释放和异常处理。







