|
msg_get_queue
Create or attach to a message queue
(PHP 4 >= 4.3.0, PHP 5)
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. Code Examples / Notes » msg_get_queuemartin dot velek
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
// 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); zxd
# # require --enable-sysvmsg configure option # # see phpinfo() to find how to check # |