msg_receive

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

msg_receiveRecibe un mensaje desde una cola de mensajes

Descripción

msg_receive(
    SysvMessageQueue $queue,
    int $desired_message_type,
    int &$received_message_type,
    int $max_message_size,
    mixed &$message,
    bool $unserialize = true,
    int $flags = 0,
    int &$error_code = null
): bool

msg_receive() recibe el primer mensaje de la cola queue, cuyo tipo está especificado por desired_message_type.

Parámetros

queue

Descriptor de recurso de cola de mensajes

desired_message_type

Si desired_message_type vale 0, se devuelve el primer mensaje de la cola. Si desired_message_type vale más que 0, entonces se devolverá el primer mensaje de ese tipo. Si desired_message_type vale menos que 0, se devolverá el primer mensaje de la cola cuyo tipo sea inferior o igual al valor absoluto de desired_message_type. Si no hay mensajes que cumplan los criterios, el script esperará a que llegue un mensaje de ese tipo a la cola. Este bloqueo puede evitarse especificando la opción MSG_IPC_NOWAIT en el parámetro flags.

received_message_type

El tipo de mensaje recibido se almacenará en este parámetro.

max_message_size

El tamaño máximo de mensaje se establece mediante max_message_size; si el mensaje de la cola es más grande que este tamaño, la función fallará (a menos que se utilice una opción flags, descrita a continuación).

message

El mensaje recibido se almacenará en el parámetro message, a menos que haya habido errores al recibir el mensaje.

unserialize

Cuando esto es cierto, el mensaje se trata como si hubiera sido serializado con el mismo mecanismo que el módulo de sesión. El mensaje será entonces deserializado y devuelto al script. Esto permitirá recibir fácilmente arrays u objetos complejos en su script, enviados por otros scripts PHP, o, si se utiliza WDDX, desde cualquier fuente compatible con WDDX.

Si unserialize vale false, el mensaje se devolverá intacto, sin modificar los valores binarios.

flags

El parámetro flags permite pasar opciones para configurar las llamadas msgrcv. Por omisión, vale 0, pero se pueden especificar una o varias opciones combinándolas con el operador OR.

Opciones de la función msg_receive()
MSG_IPC_NOWAIT Si no hay mensajes del tipo desired_message_type, se devuelve inmediatamente y no se espera. La función fallará y devolverá un entero correspondiente a MSG_ENOMSG.
MSG_EXCEPT Al utilizar esta opción en combinación con un tipo desired_message_type superior a 0, la función leerá el primer mensaje que no sea del tipo solicitado por desired_message_type.
MSG_NOERROR Si el mensaje es más grande que max_message_size, esta opción truncará el mensaje al tamaño de max_message_size y no reportará errores.

errorcode

Si la función falla, el parámetro opcional error_code se establecerá al valor de la variable del sistema errno.

Valores devueltos

Esta función retorna true en caso de éxito o false si ocurre un error.

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

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 5 notes

up
2
marbledore at mail dot ru
14 years ago
It looks like msg_receive() allocates a memory with size $maxsize, and only then tries to receive a message from queue into allocated memory. Because my script dies with $maxsize = 1 Gib, but works with $maxsize = 10 Kib.
up
1
eimers at mehrkanal dot com
17 years ago
<?php error_reporting(E_ALL);
/**
* Example for sending and receiving Messages via the System V Message Queue
*
* To try this script run it synchron/asynchron twice times. One time with ?typ=send and one time with ?typ=receive
*
* @author Thomas Eimers - Mehrkanal GmbH
*
* This document is distributed in the hope that it will be useful, but without any warranty;
* without even the implied warranty of merchantability or fitness for a particular purpose.
*/

header('Content-Type: text/plain; charset=ISO-8859-1');
echo
"Start...\n";

// Create System V Message Queue. Integer value is the number of the Queue
$queue = msg_get_queue(100379);

// Sendoptions
$message='nachricht'; // Transfering Data
$serialize_needed=false; // Must the transfer data be serialized ?
$block_send=false; // Block if Message could not be send (Queue full...) (true/false)
$msgtype_send=1; // Any Integer above 0. It signeds every Message. So you could handle multible message
// type in one Queue.

// Receiveoptions
$msgtype_receive=1; // Whiche type of Message we want to receive ? (Here, the type is the same as the type we send,
// but if you set this to 0 you receive the next Message in the Queue with any type.
$maxsize=100; // How long is the maximal data you like to receive.
$option_receive=MSG_IPC_NOWAIT; // If there are no messages of the wanted type in the Queue continue without wating.
// If is set to NULL wait for a Message.

// Send or receive 20 Messages
for ($i=0;$i<20;$i++) {
sleep(1);
// This one sends
if ($_GET['typ']=='send') {
if(
msg_send($queue,$msgtype_send, $message,$serialize_needed, $block_send,$err)===true) {
echo
"Message sendet.\n";
} else {
var_dump($err);
}
// This one received
} else {
$queue_status=msg_stat_queue($queue);
echo
'Messages in the queue: '.$queue_status['msg_qnum']."\n";

// WARNUNG: nur weil vor einer Zeile Code noch Nachrichten in der Queue waren, muss das jetzt nciht mehr der Fall sein!
if ($queue_status['msg_qnum']>0) {
if (
msg_receive($queue,$msgtype_receive ,$msgtype_erhalten,$maxsize,$daten,$serialize_needed, $option_receive, $err)===true) {
echo
"Received data".$daten."\n";
} else {
var_dump($err);
}
}
}
}

?>
up
1
soger
6 years ago
It seems that a maxsize of 2Mb is some sort of a threshold for php, above that msg_receive() starts to use a lot of CPU (with a sender that is pushing messages non-stop receiving 10000 messages jumps up from 0.01 sec to 1.5 sec on my computer) so try to stay below that thresholod if you can.
up
0
marvel at post dot cz
17 years ago
Consider this e.g. Linux situation:

<?php
//file send.php
$ip = msg_get_queue(12340);
msg_send($ip,8,"abcd",false,false,$err);
//-----------------------------------------------------
<?php
//file receive.php
$ip = msg_get_queue(12340);

msg_receive($ip,0,$msgtype,4,$data,false,null,$err);
echo
"msgtype {$msgtype} data {$data}\n";

msg_receive($ip,0,$msgtype,4,$data,false,null,$err);
echo
"msgtype {$msgtype} data {$data}\n";
?>

Now run:
in terminal #1 php5 receive.php
in terminal #2 php5 receive.php
in terminal #3 php5 send.php

Showing messages from queue will flip-flop. It means you run once send.php, the message will be shown in terminal #1. Second run it will be in t#2, third #1 and so on.
up
0
webmaster at toolshed51 dot com
22 years ago
This is meant to be run as your apache user in a terminal, call script in note of msg_send and they will communicate.

#! /usr/bin/env php
<?php
$MSGKEY
= 519051; // Message

$msg_id = msg_get_queue ($MSGKEY, 0600);

while (
1) {
if (
msg_receive ($msg_id, 1, $msg_type, 16384, $msg, true, 0, $msg_error)) {
if (
$msg == 'Quit') break;
echo
"$msg\n";
} else {
echo
"Received $msg_error fetching message\n";
break;
}
}

msg_remove_queue ($msg_id);
?>
To Top