2019-09-06 23:53:10 +08:00

74 lines
1.7 KiB
PHP
Executable File

<?php
echo "Sending text to msg queue.\n";
class SwooleTask
{
protected $queueId;
protected $workerId;
protected $taskId = 0;
function __construct($key, $workerId = 0)
{
$this->queueId = msg_get_queue($key);
if ($this->queueId === false)
{
throw new \Swoole\Exception("msg_get_queue() failed.");
}
$this->workerId = $workerId;
}
protected function pack($data)
{
$fromFd = 0;
$type = 7;
if (!is_string($data))
{
$data = serialize($data);
$fromFd |= 2;
}
if (strlen($data) >= 8180)
{
$tmpFile = tempnam('/tmp/', 'swoole.task');
file_put_contents($tmpFile, $data);
$data = pack('l', strlen($data)) . $tmpFile . "\0";
$fromFd |= 1;
$len = 128 + 24;
}
else
{
$len = strlen($data);
}
//typedef struct _swDataHead
//{
// int fd;
// uint16_t len;
// int16_t from_id;
// uint8_t type;
// uint8_t flags;
// uint16_t from_fd;
//} swDataHead;
return pack('lSsCCS', $this->taskId++, $len, $this->workerId, $type, 0, $fromFd) . $data;
}
function dispatch($data)
{
if (!msg_send($this->queueId, $this->workerId + 1, $this->pack($data), false))
{
return false;
}
else
{
return true;
}
}
}
$task = new SwooleTask(0x70001001);
//普通字符串
$task->dispatch("Hello from PHP!");
//数组
$task->dispatch(array('data' => str_repeat('A', 1024), 'type' => 1));
//大包
$task->dispatch(array('data' => str_repeat('B', 1024 * 32), 'type' => 2));