PHP 8.5.0 Alpha 1 available for testing

msg_send

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

msg_sendEnvía un mensaje a una cola

Descripción

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() envía el mensaje message de tipo message_type (que DEBE ser mayor que 0) a la cola de mensajes identificada por queue.

Parámetros

queue

La cola de mensajes

message_type

El tipo del mensaje (DEBE ser mayor que 0)

message

El cuerpo del mensaje

Nota:

Si serialize está definido como false, DEBE ser del tipo: chaîne de caractères, entier, nombre décimal o booléen. En otros casos se emitirá un aviso.

serialize

El parámetro opcional serialize controla el método de envío del mensaje message. serialize tiene por omisión el valor true lo que significa que el mensaje message será serializado utilizando el mismo mecanismo que el utilizado por las sesiones, antes de ser enviado a la cola de mensajes. Esto permite enviar arrays y objetos complejos a otros scripts PHP, o bien, si se utiliza la extensión WDDX, intercambiar mensajes con clientes compatibles WDDX.

blocking

Si el mensaje es demasiado grande para ser almacenado por la cola, su script esperará hasta que otro proceso lea de la cola un mensaje, y libere suficiente espacio para su mensaje. Este es el modo bloqueante: puede evitar este modo utilizando el parámetro blocking con el valor false: en este caso, msg_send() retornará inmediatamente false si el mensaje es demasiado grande para la cola. Asignará entonces al parámetro error_code el valor de MSG_EAGAIN, indicando que debería intentar enviar su mensaje de nuevo, un poco más tarde.

error_code

Si la función falla, el código de error opcional será definido con el valor de la variable del sistema errno.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Al enviar con éxito un mensaje, la cola se actualiza de la siguiente manera: msg_lrpid toma el valor del identificador de proceso del proceso llamante, msg_qnum se incrementa en 1 y msg_rtime toma la fecha y hora actual.

Historial de cambios

Versión Descripción
8.0.0 queue ahora espera una SysvMessageQueue; anteriormente, se esperaba un resource.

Ver también

add a note

User Contributed Notes 3 notes

up
5
qeekin at gmail dot com
11 years ago
I created example how to comunnicate with programe written in C throught messages queues. First run C program (it will create queue) then PHP script.

C code compile with: gcc -std=c99 -o test_queue test_queue.c

test_queue.c:
/**
* Example how to use System V Messages Queues with PHP and C program.
* This is simple server which create message queue and receive message from it.
* Based on Beej's Guide to Unix IPC
* Autor: 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>

/* Buffer struct for receiving messages */
struct php_buf {
long mtype;
char msg[200];
};

int main(void)
{
struct php_buf buf;
int msqid;
key_t key;

/* Generate key (/var/www/index.php must be accessible file) */
if((key = ftok("/var/www/index.php", 'G')) == -1) {
perror("ftok");
exit(EXIT_FAILURE);
}

/* Create message queue */
if((msqid = msgget(key, 0666 | IPC_CREAT)) == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}

printf("Ready to get string from PHP!\n");

/* Receive message */
if(msgrcv(msqid, &buf, sizeof(buf.msg)-1, 0, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}

/* Eliminate segmentation fault */
buf.msg[199] = '\0';

printf("Recieved from PHP: %s\n", buf.msg);

/* Destroy message queue */
if(msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}

return EXIT_SUCCESS;
}

test_queue.php:
<?php
/**
* Example how to use System V Messages Queues with PHP and C program.
* This is simple server which create message queue and receive message from it.
* Based on Beej's Guide to Unix IPC
* Autor: Jan Drazil, <qeekin at gmail dot com>
*/

/* Generate key, param fot ftok must be same as in test_msg.c */
if(($key = ftok("/var/www/index.php", "G")) == -1)
die(
"ftok");

if(!
msg_queue_exists($key))
die(
"message queue doesn't exists");

/* Connect to message queue */
if(($msqid = msg_get_queue($key)) === FALSE)
die(
"msg_get_queue");

echo
"Sending text to msg queue.\n";

/* Send message to C program */
if(!msg_send($msqid, 12, "Hello from PHP!\0", false))
die(
"msg_send");

echo
"Done"
?>
up
4
Muffinman
12 years ago
When sending non-complex (serialize = false) messages to a program in C, you need to add the null character to the string (\0). Otherwise the previous message will be partially visible if it is longer than the current message. Took some kind help from comp.lang.php for me to figure that out. While it seems so obvious now, I thought I'd share it here.
up
3
michael dot NO dot SP dot AM dot cordover+php at gmail dot com
15 years ago
After about an hour of debugging I've discovered the meaning of the undocumented "PHP Warning: msg_send(): msgsnd failed: Invalid argument" ($errorcode = 13).

This occurred when the size of $message was larger than msg_qbytes (see msg_stat_queue() for how to determine and change msg_qbytes).
To Top