msg_get_queue

advertisement
ftok
msg_queue_exists
Semaphore 函数
在线手册:中文 英文
PHP 手册
msg_get_queue
(PHP 4 >= 4.3.0, PHP 5)
msg_get_queue - Create or attach to a message queue
说明
resource msg_get_queue ( int $key [, int $perms ] )
msg_get_queue() returns an id that can be used to access the System V message queue
with the given key. The first call creates the message queue with the optional perms.
A second call to msg_get_queue() for the same key will return a different message
queue identifier, but both identifiers access the same underlying message queue.
参数
key
Message queue numeric ID
perms
Queue permissions. Default to 0666. If the message queue already exists, the
perms will be ignored.
返回值
Returns a resource handle that can be used to access the System V message queue.
参见





msg_remove_queue() - Destroy a message queue
msg_receive() - Receive a message from a message queue
msg_send() - Send a message to a message queue
msg_stat_queue() - Returns information from the message queue data
structure
msg_set_queue() - Set information in the message queue data structure
ftok
msg_queue_exists
Semaphore 函数
在线手册:中文 英文
PHP 手册
用户评论:
Michael Iatrou (03-Jul-2010 12:47)
If you are getting the following message (on Linux):
Warning: msg_get_queue() [function.msg-get-queue]: failed for key
0x12345678: No space left on device in /path/to/script.php on line 1
aside from what [others have] suggested, you should also check and
set an appropriate value for kernel parameter kernel.msgmni, e.g.
sysctl -w kernel.msgmni=256
Morten Brrup (18-Mar-2010 05:08)
IPC_CREAT has no effect in this function. The PHP source code (file
sysvmsg.c) reveals that only if msgget(key,0) fails, msgget(key,
IPC_CREAT | IPC_EXCL | perms) is used.
pail dot luo at gmail dot com (01-Mar-2009 01:22)
A simple Sample to introduce Message Queue.
<?php
if ( sizeof($argv)<2 ) {
echo "Usage: $argv[0] stat|send|receive|remove msgType MSG [msg]
\n\n" ;
echo " EX: $argv[0] send 1 \"This is no 1\" \n" ;
echo " $argv[0] receive ID \n" ;
echo " $argv[0] stat \n" ;
echo " $argv[0] remove \n" ;
exit;
}
$MSGKey = "123456" ;
## Create or attach to a message queue
$seg = msg_get_queue($MSGKey) ;
switch ( $argv[1] ) {
case "send":
msg_send($seg, $argv[2], $argv[3]);
echo "msg_send done...\n" ;
break;
case "receive":
$stat = msg_stat_queue( $seg );
echo 'Messages in the queue: '.$stat['msg_qnum']."\n";
if ( $stat['msg_qnum']>0 ) {
msg_receive($seg, $argv[2], $msgtype, 1024, $data);
var_dump($msgtype);
var_dump($data);
echo "\n";
}
else {
echo "No Msg...\n";
}
break;
case "stat":
print_r( msg_stat_queue($seg) );
break;
case "remove":
msg_remove_queue($seg);
break;
}
?>
david dot schueler at tel-billig dot de (18-Dec-2008 12:17)
If you are getting this message on your *NIX box:
Warning: msg_get_queue() [function.msg-get-queue]: failed for key
0x12345678: No space left on device in /path/to/script.php on line 1
you may use the command "ipcrm" as root to clear the message queue.
Use "man ipcrm" to get more info on it.
The default setting for maximum messages in the queue is stored in
/proc/sys/fs/mqueue/msg_max. To increase it to a maximum of 100
messages, just run:
echo 100 > /proc/sys/fs/mqueue/msg_max
Please ensure to follow a good programming style and close/free all
your message queues before your script exits to avoid those warning
messages.
martin dot velek at gmail dot com (01-Aug-2007 07:23)
Lack of IPC_EXCL makes me unhappy. Of course, you can use ftok() to
generate a unique key. This code is not allmighty, another process
under the same user can open the queue and function returns true. But
in some situation it could help.
code:
<?
function ipcEXCL($res,$perm)
{
$pole = msg_stat_queue($res);
if($pole['msg_perm.uid']==posix_getuid() &&
$pole['msg_perm.gid']==posix_getgid() &&
$pole['msg_perm.mode']==$perm &&
$pole['msg_stime']==0 &&
$pole['msg_rtime']==0 &&
$pole['msg_qnum']==0 &&
$pole['msg_lspid']==0 &&
$pole['msg_rspid']==0)
return true;
else
return false;
}
$res=msg_get_queue($key,$perm);
if(ipcEXCL($res,$perm))
echo "probably I am a creator:";
else
echo "probably not";
?>
joeldg AT listbid.com (03-May-2003 03:10)
// Here is an example of working with message queues.
// if you have forked processes, this could be a great way of passing
// out work to them
// create the message queue
// pick a file..
$key_t = msg_get_queue(ftok("/tmp/php_msgqueue.stat", 'R'),0666 |
IPC_CREAT);
// place two messages on the queue
if (!msg_send ($key_t, 1, 'This is message #1', true, true,
$msg_err))
echo "Msg not sent because $msg_err\n";
if (!msg_send ($key_t, 1, 'This is message #2 ', true, true,
$msg_err))
echo "Msg not sent because $msg_err\n";
// lets look at the queue structure 'msg_qnum' is really what we want
to see
// it should be '2'
print_r(msg_stat_queue($key_t));
// pull off the stack
if (msg_receive ($key_t, 1, $msg_type, 16384, $msg, true, 0,
$msg_error)) {
if ($msg == 'Quit');
echo "$msg\n"; // prints 'This is message #1'
} else {
echo "Received $msg_error fetching message\n";
}
// look at the structure again, ms_qnum should be '1'
print_r(msg_stat_queue($key_t));
if (msg_receive ($key_t, 1, $msg_type, 16384, $msg, true, 0,
$msg_error)) {
if ($msg == 'Quit');
echo "$msg\n"; // prints 'This is message #2'
} else {
echo "Received $msg_error fetching message\n";
}
// look at the structure again, ms_qnum should be '0', no more
messages on the queue
print_r(msg_stat_queue($key_t));
// get rid of the queue we created
msg_remove_queue ($key_t);
Download