承接 takuya/php-sysv-ipc-message-queue 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

takuya/php-sysv-ipc-message-queue

最新稳定版本:0.1.2

Composer 安装命令:

composer require takuya/php-sysv-ipc-message-queue

包简介

README 文档

README

php sysv ipc message queue wrapper

IPC Message Queue for php

SysV IPC Message queue is available as php function. This package is Object Class wrapping msg_send.

This repository wrap function and frequently appearing Usage.

Installing

from Packagist.

composer require takuya/php-sysv-ipc-message-queue

from GitHub.

name='php-sysv-ipc-message-queue'
composer config repositories.$name \
vcs https://github.com/takuya/$name  
composer require takuya/$name:master
composer install

Examples.

  • Initialize and push
  • Dont forget remove Queue.
  • Save and Load for system ShutDown.
  • Multi process (inter process).

Initialize and push to Queue

initialize and send data to queue.

$q = new IPCMsgQueue('my-named-queue');
$msg = 'random string';
$q->push($msg);

Since msg_send is supporting serialize. we can push everything.

$q = new IPCMsgQueue('my-named-queue');
// send array 
$msg = ['a'=>1];
$q->push($msg);
// send object
$obj = new stdClass();
$obj->name = 'takuya';
$msg = $obj;
$q->push($msg);

We can get queue message as is sent.

$q = new IPCMsgQueue('my-named-queue');
$arr = ['a'=>1];
$q->push($msg=$arr);
// retrieve data as send.
$result = $q->pop();
// same to send
$arr == $result #=> true

Notice, by serialize() , message size increased.(over 1024, large bytes);

## large bytes 
$msg = str_rand(1024);
$q = new IPCMsgQueue('my-named-queue');
$q->push($msg);
// will be not same to $msg.
$result = $q->pop();
// to get same data,specify large size.
$result = $q->pop(null,strlen(serialize($msg)));// will be 10 byte larger.

I wrote this class , suppose to be used simple message. large size (>1024) is un-usual way.

Don't forget to remove queue never used.

use destroy() to remove queue.

require_once 'vendor/autoload.php';
use Takuya\PhpSysvMessageQueue\IPCMsgQueue;
$q = new IPCMsgQueue('my-named-queue');
$q->push('message');
$q->pop();
$q->destroy();

Or use ipcs -q, ipcrm command to remove unnecessary used queue.

ipcs -q | grep takuya
ipcrm --queue-key 0x1234567
## you can delete at once.
ipcs -q | grep takuya | grep -oE '0x[a-f0-9]+' | xargs -I@ ipcrm --queue-key @

Queue will be remains unless explicitly deleted.

save and load when OS shutdown.

SysV IPC Message will be lost after shutdown. to prevent lost , try save and load messages.

Before shutdown

$q = new IPCMsgQueue('my-named-queue');
// push some messages
$q->push('msg');
$q->push('msg');
$q->push('msg');
// save before shutdown.
$q->save('path/to/permanent/file');

After restart

$q = new IPCMsgQueue('my-named-queue');
// load after system restarted.
$q->load('path/to/permanent/file');
// can read data 
$q->pop()#=>'msg';
$q->pop()#=>'msg';
$q->pop()#=>'msg';

Multi Process (IPC)

Multi process (inter process). same name same queue.

consumer.php (worker)

<?php
require_once 'vendor/autoload.php';
use Takuya\PhpSysvMessageQueue\IPCMsgQueue;
$name = 'my-queue';
$q = new IPCMsgQueue($name);
register_shutdown_function(fn()=>$q->destroy());
while($q->available()){
  $body = $q->pop();// blocking io
  var_dump($body);
}

producer.php ( maker )

require_once 'vendor/autoload.php';
use Takuya\PhpSysvMessageQueue\IPCMsgQueue;

$name = 'my-queue';
$q = new IPCMsgQueue($name);

foreach (range(0,10) as $cnt){
  $q->push('job:'.$cnt);
  sleep(10);
}

run

php consumer.php & # run in background.
php producer.php

Comparison

PHP's IPC System Message Queue function msg_send has auto serialization, This is very useful.

Compare SysV IPC Queue to another shared way. IPC Queue is easy to use.

type advantage to SysV mesg func dis-advantage to sysV func
tcp:// can listen another pc Manual serialization, data structure design, read size needs manually adjustment
Shared-Memory and Semaphore can share same data Be careful of R/W timming (Semaphore), manually blocking, Queue Data structure needs fully considered, manually serialization
File and flock() data persistence is easy Be careful of R/W timming(flock), Data structure fully considered, manually serialization
sqlite / sql Easy to data persistence Needs SQL knowledge or O/R mapper, manually serialization

PHP's SplQueue or SplStack cannot share data to another process, These require sql or file library to use.

In that reason, msg_send msg_receive is the easiest way to share Tasks.

统计信息

  • 总下载量: 1.01k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 1
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: GPL-3.0-or-later
  • 更新时间: 2025-02-17