Exemple #1
0
 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));
     }
 }
Exemple #4
0
    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.');
     }
 }
Exemple #7
0
 /**
  * 初始化 配置、进程名、共享内存、消息队列等
  * @return void
  */
 public static function init()
 {
     // 因为子进程要更换用户、开低端口等,必须是root启动
     if ($user_info = posix_getpwuid(posix_getuid())) {
         if ($user_info['name'] !== 'root') {
             exit("You should run workerman as root . Permission denied\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";