PHP Conference Nagoya 2025

msg_receive

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

msg_receiveReçoit un message depuis une file de messages

Description

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() reçoit le premier message de la file queue, le type est spécifié par desired_message_type.

Liste de paramètres

queue

Descripteur de ressource de file d'attente de messages

desired_message_type

Si desired_message_type vaut 0, le premier message de la file est retourné. Si desired_message_type vaut plus que 0, alors le premier message de ce type sera retourné. Si desired_message_type vaut moins que 0, le premier message de la file ayant un type inférieur ou égal à la valeur absolue de desired_message_type sera retourné. Si aucun message ne correspond aux critères, votre script attendra la venue d'un tel message dans la file. Vous pouvez éviter ce blocage en précisant l'option MSG_IPC_NOWAIT dans le paramètre flags.

received_message_type

Le type de message qui a été reçu sera stocké dans ce paramètre.

max_message_size

La taille maximale de message est fixée par max_message_size ; si le message de la file est plus grand que cette taille, la fonction échouera (à moins que vous n'utilisiez une option flags, décrite ci-dessous).

message

Le message reçu sera stocké dans le paramètre message, à moins qu'il n'y ait eu des erreurs de réception du message.

unserialize

Quand c'est le cas, le message est traité comme s'il avait été sérialisé avec le même mécanisme que le module de session. Le message sera alors désérialisé, puis retourné au script. Cela vous permettra de recevoir facilement des tableaux ou des objets complexes dans votre script, émis par d'autres scripts PHP, ou, si vous utilisez WDDX, depuis n'importe quelle source compatible WDDX.

Si unserialize vaut false, le message sera retourné intact, et sans modifier les valeurs binaires.

flags

Le paramètre flags permet de passer des options pour configurer les appels msgrcv. Par défaut, il vaut 0, mais vous pouvez spécifier une ou plusieurs options en les combinant avec l'opérateur OR).

Options de la fonction msg_receive()
MSG_IPC_NOWAIT S'il n'y a pas de message du type desired_message_type, retourne immédiatement et n'attend pas. La fonction échouera et retournera un entier correspondant à MSG_ENOMSG.
MSG_EXCEPT En utilisant cette option en combinaison avec un type desired_message_type supérieur à 0, la fonction va lire le premier message qui n'est pas du type demandé par desired_message_type.
MSG_NOERROR Si le message est plus grand que max_message_size, cette option va tronquer le message à la taille de max_message_size et ne signalera pas d'erreur.

errorcode

Si la fonction échoue, le paramètre optionnel error_code sera défini à la valeur de la variable système errno.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Lors de la réception réussie d'un message, la file est mise à jour comme ceci : msg_lrpid prend la valeur de l'identifiant de processus du processus appelant, msg_qnum est décrémenté de 1 et msg_rtime prend la date et l'heure courante.

Historique

Version Description
8.0.0 queue attend désormais une SysvMessageQueue; auparavant, une resource était attendue.

Voir aussi

add a note

User Contributed Notes 5 notes

up
2
marbledore at mail dot ru
13 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
16 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
5 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
16 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
21 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