msg_send

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

msg_send向消息队列发送消息

描述

msg_send(
    SysvMessageQueue $queue,
    int $message_type,
    string|int|float|bool $message,
    bool $serialize = true,
    bool $blocking = true,
    int &$error_code = null
): bool

msg_send() 将类型为 message_type(必须大于 0)的 message 发送到 queue 指定的消息队列。

参数

queue

消息队列。

message_type

消息类型(必须大于 0)

message

消息内容。

注意:

如果 serialize 设置为 false,则必须为以下类型:stringintfloatbool。在其他情况下,将发出警告。

serialize

可选的 serialize 控制如何发送 messageserialize 默认为 true,这意味着 message 使用与会话模块相同的机制进行序列化,然后再发送到队列。这允许将复杂的数组和对象发送到其他 PHP 脚本,或者如果您使用 WDDX 序列化程序,则发送到任何与 WDDX 兼容的客户端。

blocking

如果消息太大而无法放入队列,您的脚本将等待另一个进程从队列中读取消息并释放足够的空间以发送您的消息。这称为阻塞;您可以通过将可选的 blocking 参数设置为 false 来防止阻塞,在这种情况下,如果消息太大而无法放入队列,msg_send() 将立即返回 false,并将可选的 error_code 设置为 MSG_EAGAIN,指示您应该稍后再尝试发送消息。

error_code

如果函数失败,可选的错误代码将设置为系统 errno 变量的值。

返回值

成功时返回 true,失败时返回 false

成功完成后,消息队列数据结构将按如下方式更新:msg_lspid 设置为调用进程的进程 ID,msg_qnum 增加 1,msg_stime 设置为当前时间。

变更日志

版本 描述
8.0.0 queue 现在期望一个 SysvMessageQueue 实例;以前,期望一个 resource

参见

添加注释

用户贡献的注释 3 个注释

qeekin at gmail dot com
10 年前
我创建了通过消息队列与用 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
/**
* 使用 System V 消息队列的示例,与 PHP 和 C 程序一起使用。
* 这是一个简单的服务器,它创建消息队列并接收来自它的消息。
* 基于 Beej 的 Unix IPC 指南
* 作者:Jan Drazil,<qeekin at gmail dot com>
*/

/* 生成密钥,ftok 的参数必须与 test_msg.c 中的一致 */
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";

/* 将消息发送到 C 程序 */
if(!msg_send($msqid, 12, "Hello from PHP!\0", false))
die(
"msg_send");

echo
"完成"
?>
Muffinman
11 年前
向 C 中的程序发送非复杂(serialize = false)消息时,您需要向字符串添加空字符(\0)。否则,如果当前消息比先前消息短,先前消息将部分可见。我从 comp.lang.php 获得了一些帮助才弄明白这一点。虽然现在看起来很明显,但我还是想在这里分享一下。
michael dot NO dot SP dot AM dot cordover+php at gmail dot com
14 年前
经过大约一个小时的调试,我发现了未记录的“PHP Warning: msg_send(): msgsnd failed: Invalid argument”($errorcode = 13) 的含义。

当 $message 的大小大于 msg_qbytes 时(有关如何确定和更改 msg_qbytes,请参阅 msg_stat_queue()),就会出现这种情况。
To Top