public function __construct() { $this->ipc_fn = tempnam(sys_get_temp_dir(), 'csp.' . uniqid('chn', true)); $this->key = ftok($this->ipc_fn, 'A'); $this->ipc = msg_get_queue($this->key, 0666); msg_set_queue($this->ipc, $cfg = ['msg_qbytes' => 1 * PHP_INT_LENGTH]); }
public function start() { set_time_limit(0); if (file_exists($this->file)) { unlink($this->file); } file_put_contents($this->file, ''); $this->queue = msg_get_queue(ftok($this->file, 'R'), 0777); msg_set_queue($this->queue, []); msg_remove_queue($this->queue); $this->queue = msg_get_queue(ftok($this->file, 'R'), 0777); $this->listen(); }
/** * 初始化 配置、进程名、共享内存、消息队列等 * @return void */ public static function init() { // 获取配置文件 $config_path = Lib\Config::$configFile; // 设置进程名称,如果支持的话 self::setProcTitle(self::NAME . ':master with-config:' . $config_path); // 初始化共享内存消息队列 if (extension_loaded('sysvmsg') && extension_loaded('sysvshm')) { self::$shmId = shm_attach(IPC_KEY, DEFAULT_SHM_SIZE, 0666); self::$queueId = msg_get_queue(IPC_KEY, 0666); msg_set_queue(self::$queueId, array('msg_qbytes' => 65535)); } }
exit(1); } $queue = msg_get_queue($token); var_dump(msg_queue_exists($token)); $pid = pcntl_fork(); if ($pid == 0) { $q = msg_get_queue($token); msg_send($q, 2, "start"); msg_receive($q, 1, $type, 100, $msg); msg_send($q, 2, $msg); // echo exit(0); } msg_receive($queue, 2, $type, 100, $msg); var_dump($msg); msg_send($queue, 1, "ok"); msg_receive($queue, 2, $type, 100, $msg); var_dump($msg); $ret = @msg_send($queue, 0, 'msg', false, false, $s_error_code); var_dump($ret); var_dump(22 === $s_error_code); // 22 - invalid argument $ret = msg_receive($queue, 0, $type, 100, $msg, false, MSG_IPC_NOWAIT, $r_error_code); var_dump($ret); var_dump(MSG_ENOMSG === $r_error_code); $ret = msg_stat_queue($queue); var_dump($ret[$s_msg_qnum]); msg_set_queue($queue, array("msg_perm.mode" => 0666)); msg_remove_queue($queue); pcntl_waitpid($pid, $status); unlink($filename);
/** * allows you to change the values of the msg_perm.uid, * msg_perm.gid, msg_perm.mode and msg_qbytes fields of the underlying message queue data structure * 可以用来修改队列运行接收的最大读取的数据 * * @param $key 状态下标 * @param $value 状态值 * @return bool */ public function set_status($key, $value) { $this->check_set_privilege($key); if ($key == 'msg_qbytes') { return $this->set_max_queue_size($value); } $queue_status[$key] = $value; return \msg_set_queue($this->queue, $queue_status); }
/** * Sets the access permissions of the semaphore. * * The current user must have access to the semaphore in order to change the permissions. * * @param int $mode A permissions mode to set. * * @throws SemaphoreException If the operation failed. */ public function setPermissions($mode) { if (!msg_set_queue($this->queue, [ 'msg_perm.mode' => $mode ])) { throw new SemaphoreException('Failed to change the semaphore permissions.'); } }
/** * 初始化 配置、进程名、共享内存、消息队列等 * @return void */ public static function init() { // 因为子进程要更换用户、开低端口等,必须是root启动 if ($user_info = posix_getpwuid(posix_getuid())) { if ($user_info['name'] !== 'root') { exit("[31;40mYou should run workerman as root . Permission denied[0m\n"); } } // 获取配置文件 $config_path = Config::$configFile; // 设置进程名称,如果支持的话 self::setProcTitle(self::NAME . ':master with-config:' . $config_path); // 初始化共享内存消息队列 if (extension_loaded('sysvmsg') && extension_loaded('sysvshm')) { self::$shmId = shm_attach(IPC_KEY, DEFAULT_SHM_SIZE); self::$queueId = msg_get_queue(IPC_KEY); msg_set_queue(self::$queueId, array('msg_qbytes' => DEFAULT_MSG_QBYTES)); } }
<?php $id = ftok(__FILE__, 'r'); $q = msg_get_queue($id); echo "Set mode:\n"; $arr = array('msg_perm.mode' => 0600); var_dump(msg_set_queue($q, $arr)); echo "Did really work:\n"; var_dump(count(array_diff_assoc($arr, msg_stat_queue($q))) == 0); echo "Set uid:\n"; // same as the running user to make it succeed $arr = array('msg_perm.uid' => getmyuid()); var_dump(msg_set_queue($q, $arr)); echo "Did really work:\n"; var_dump(count(array_diff_assoc($arr, msg_stat_queue($q))) == 0); echo "Set gid:\n"; // same as the running user to make it succeed $arr = array('msg_perm.gid' => getmygid()); var_dump(msg_set_queue($q, $arr)); echo "Did really work:\n"; var_dump(count(array_diff_assoc($arr, msg_stat_queue($q))) == 0); echo "Set smaller qbytes:\n"; $res = msg_stat_queue($q); $arr = array('msg_qbytes' => $res['msg_qbytes'] - 1); var_dump(msg_set_queue($q, $arr)); echo "Did really work:\n"; var_dump(count(array_diff_assoc($arr, msg_stat_queue($q))) == 0); if (!msg_remove_queue($q)) { echo "BAD: queue removal failed\n"; } echo "Done\n";
<?php $tests = array(null, 'foo'); foreach ($tests as $q) { if ($q === null) { do { $id = ftok(__FILE__, chr(mt_rand(0, 255))); } while (msg_queue_exists($id)); $q = msg_get_queue($id) or die("Failed to create queue"); msg_remove_queue($q) or die("Failed to close queue"); } echo "Using '{$q}' as queue resource:\n"; $errno = 0; var_dump(msg_set_queue($q, array('msg_qbytes' => 1))); var_dump(msg_stat_queue($q)); var_dump(msg_receive($q, 0, $null, 1, $msg, true, 0, $errno)); var_dump($errno != 0); // again, but triggering an E_WARNING var_dump(msg_receive($q, 0, $null, 0, $msg)); var_dump(msg_send($q, 1, 'foo', true, true, $errno)); var_dump($errno != 0); } echo "Done\n";