我创建了通过消息队列与用 C 编写的程序进行通信的示例。首先运行 C 程序(它将创建队列),然后运行 PHP 脚本。
使用以下命令编译 C 代码:gcc -std=c99 -o test_queue test_queue.c
test_queue.c
/**
* 使用 System V 消息队列的示例,与 PHP 和 C 程序一起使用。
* 这是一个简单的服务器,它创建消息队列并接收来自它的消息。
* 基于 Beej 的 Unix IPC 指南
* 作者:Jan Drazil,<qeekin at gmail dot com>
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
/* 用于接收消息的缓冲区结构 */
struct php_buf {
long mtype;
char msg[200];
};
int main(void)
{
struct php_buf buf;
int msqid;
key_t key;
/* 生成密钥(/var/www/index.php 必须是可访问文件) */
if((key = ftok("/var/www/index.php", 'G')) == -1) {
perror("ftok");
exit(EXIT_FAILURE);
}
/* 创建消息队列 */
if((msqid = msgget(key, 0666 | IPC_CREAT)) == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
printf("准备好从 PHP 获取字符串!\n");
/* 接收消息 */
if(msgrcv(msqid, &buf, sizeof(buf.msg)-1, 0, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
/* 消除段错误 */
buf.msg[199] = '\0';
printf("从 PHP 接收:%s\n", buf.msg);
/* 销毁消息队列 */
if(msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
test_queue.php
<?php
if(($key = ftok("/var/www/index.php", "G")) == -1)
die("ftok");
if(!msg_queue_exists($key))
die("消息队列不存在");
if(($msqid = msg_get_queue($key)) === FALSE)
die("msg_get_queue");
echo "将文本发送到消息队列。\n";
if(!msg_send($msqid, 12, "Hello from PHP!\0", false))
die("msg_send");
echo "完成"
?>