<?php
$key = ftok(__FILE__, 's');
// 同时最多只能有一个进程进入临界区
$sem_id = sem_get($key, 1);
echo "This is a room,can only stay one people!\n\r";
// 派生子进程
$pid = pcntl_fork();
if ($pid == -1) {
exit('fork failed!');
} else if ($pid > 0) {
$name = 'parent';
} else {
$name = 'child';
}
echo "{$name} want to enter the room \n";
sem_acquire($sem_id);
// 原子操作开始
echo "{$name} in the room , other people can't enter!\n";
sleep(3);
echo "{$name} leave the room\n";
// 原子操作结束
sem_release($sem_id);
if ($pid > 0) {
pcntl_waitpid($pid, $status);
sem_remove($sem_id);//移除信号量
}
?>
PHP进程间通信System V信号量
发布时间:January 9, 2014 // 分类:PHP // No Comments
PHP进程间通信System V共享内存
发布时间:January 9, 2014 // 分类:PHP // No Comments
Yum安装的PHP需安装扩展包php-process:
<?php
$shm_key = intval(bin2hex('node'), '16');
$memsize = 120;
$shm_h = shm_attach($shm_key, $memsize, 0644);
$var_key = intval(bin2hex('key'), '16');
$var_value = 'hello';
shm_put_var($shm_h, $var_key, $var_value);
echo shm_get_var($shm_h, $var_key);
shm_remove_var($shm_h, $var_key);
shm_detach($shm_h);
?>
PHP进程间通信System V消息队列
发布时间:January 9, 2014 // 分类:PHP // No Comments
多进程:
<?php
//生成key
$message_queue_key = ftok(__FILE__, 'a');
//根据生成的key新建队列,也可自定,如123456
$message_queue = msg_get_queue($message_queue_key, 0666);
$pids = array();
for ($i = 0; $i < 5; $i++) {
//创建子进程
$pids[$i] = pcntl_fork();
if ($pids[$i]) {
echo "No.$i child process was created, the pid is $pids[$i]\r\n";
pcntl_wait($status);//非阻塞的线程等待,防止僵尸进程的出现
} elseif ($pids[$i] == 0) {
$pid = posix_getpid();
echo "process.$pid is writing now\r\n";
//写队列
msg_send($message_queue, 1, "this is process.$pid's data\r\n");
posix_kill($pid, SIGTERM);
}
}
do {
//读队列
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);
echo $message;
//获取队列内消息数
$a = msg_stat_queue($message_queue);
if($a['msg_qnum'] == 0){
break;
}
} while(true)
?>
父子进程:
<?php
$message_queue_key = ftok(__FILE__, 'a');
$message_queue = msg_get_queue($message_queue_key, 0666);
$pid = pcntl_fork();
if ($pid==-1) {
die("cannot fork");
} else if ($pid) { //父进程
pcntl_wait($status);
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);
echo $message;
} else {
$pid = posix_getpid(); //子进程
msg_send($message_queue, 1, "this is process.$pid's data\r\n");
}
?>
Tokyo Cabinet表格型数据结构
发布时间:January 8, 2014 // 分类:NoSQL // No Comments
Tokyo Cabinet支持Table数据结构,类似于SQL,可按条件查找索引,记录下:
#新建数据库,实际上类似于SQL表
tctmgr create user.tct
#key1为主健,name和passwd为字段
tctmgr put user.tct key1 "name" "u1" "passwd" "123"
#列出当前表数据
tctmgr list -pv user.tct
#按字段查找,类似于select * from where name = u1 limit 15;
tctmgr search -pv -m 15 user.tct name STREQ "u1"
#建立索引
tctmgr setindex user.tct name
PHP接口:
<?php
$tt = new TokyoTyrantTable("localhost", 1978);
$query = $tt->getQuery();
$query->addCond("name", TokyoTyrant::RDBQC_STREQ, "u1")->setLimit(5, 5);
var_dump($query->search());
?>
Kyoto Cabinet和LevelDB实现任务队列
发布时间:January 7, 2014 // 分类:消息队列 // No Comments
根据Tokyo Tyrant自带的Lua队列脚本修改,Kyoto Cabinet和Tokyo Tyrant的API有很大不同。
kt = __kyototycoon__
db = kt.db
-- 记录日志
if kt.thid == 0 then
kt.log("system", "the Lua script has been loaded")
end
-- 入队列
function enqueue(inmap, outmap)
local key = inmap.key
local value = inmap.value
--队列值自增1,空从0开始
local id = db:increment_double(key, 1)
if not id then
return kt.RVEINTERNAL
end
key = string.format("%s-%012d", key, id)
if not db:add(key, value) then
return kt.RVEINTERNAL
end
outmap[key] = "ok"
return kt.RVSUCCESS
end
-- 出队列
function dequeue(inmap, outmap)
local key = inmap.key
local max = inmap.max
max = tonumber(max)
if not max or max < 1 then
max = 1
end
key = string.format("%s-", key)
--匹配队列前缀,返回多个匹配的key
local keys = db:match_prefix(key, max)
local res = ""
for i = 1, #keys do
local key = keys[i]
local value = db:get(key)
if db:remove(key) and value then
--要返回的结果
outmap[keys[i]] = value
end
end
return kt.RVSUCCESS
end
-- 查看队列大小
function queuesize(inmap, outmap)
local key = inmap.key
key = string.format("%s-", key)
local keys = db:match_prefix(key)
outmap.size = #keys
return kt.RVSUCCESS
end
-- 重置队列ID从0开始
function queuereset(inmap, outmap)
local key = inmap.key
if not key then
return kt.RVEINVALID
end
if not db:remove(key) then
local err = db:error()
if err:code() == kt.Error.NOREC then
return kt.RVELOGIC
end
return kt.RVEINTERNAL
end
return kt.RVSUCCESS
end
使用:
ktremotemgr script -host 192.168.1.3 -port 1978 enqueue key queue value value1
ktremotemgr script -host 192.168.1.3 -port 1978 dequeue key queue max 10
curl "http://192.168.1.3:1978/rpc/play_script?name=enqueue&_key=queue&_value=value1"
curl "http://192.168.1.3:1978/rpc/play_script?name=dequeue&_key=queue&_max=10"
分类
- Apache (13)
- Nginx (45)
- PHP (86)
- IIS (8)
- Mail (17)
- DNS (16)
- Cacti (14)
- Squid (5)
- Nagios (4)
- Puppet (7)
- CentOS (13)
- Iptables (23)
- RADIUS (3)
- OpenWrt (41)
- DD-WRT (1)
- VMware (9)
- 网站程序 (2)
- 备份存储 (11)
- 常用软件 (20)
- 日记分析 (10)
- Linux基础 (18)
- 欧诺代理 (0)
- Linux服务 (18)
- 系统监控 (4)
- 流量监控 (7)
- 虚拟化 (28)
- 伪静态 (2)
- LVM (3)
- Shell (18)
- 高可用 (2)
- 数据库 (16)
- FreeBSD (3)
- 网络安全 (25)
- Windows (35)
- 网络工具 (22)
- 控制面板 (3)
- 系统调优 (10)
- Cisco (3)
- VPN (6)
- ROS (20)
- Vim (14)
- KMS (4)
- PXE (2)
- Mac (1)
- Git (1)
- PE (1)
- LNS (2)
- Xshell (7)
- Firefox (13)
- Cygwin (4)
- OpenSSL (9)
- Sandboxie (3)
- StrokesPlus (1)
- AutoHotKey (4)
- Total Commander (3)
- WordPress (3)
- iMacros (6)
- Typecho (2)
- Ollydbg (1)
- Photoshop (1)
- 正则 (3)
- Debian (3)
- Python (8)
- NoSQL (6)
- 消息队列 (4)
- JS (7)
- Tmux (3)
- GO (7)
- HHVM (2)
- 算法 (1)
- Docker (2)
- PT (15)
- N1 (16)
- K2P (6)
- LUKS (4)
最新文章
- sandboxie plus运行firefox 140播放视频全屏不能覆盖任务栏
- TEWA-1100G光猫使用
- 烽火光猫HG5382A3使用
- 记联通更换移动XG-040G-MD光猫
- smokeping slave同步错误illegal attempt to update using time解决
- 使用valgrind定位解决smartdns内存泄露
- 此内容被密码保护
- debian12下initramfs-tools配置ip子网掩码255.255.255.255/32失败解决
- iPhone查看屏幕供应商
- 光猫拨号ImmortalWrt/OpenWRT路由获取ipv6遇到的问题
最近回复
- 海运: 可能版本问题
- 海运: 如果运营商限制型号
- 海运: 没有
- Mruru: 烽火猫切换rootfs的方法有么大佬?
- nono: 修改光猫型号是做啥子用的
- 960: root账号默认密码hg2x0 不对哇
- rer: 感谢分享!~
- opnfense: 谢谢博主!!!解决问题了!!!我之前一直以为内置的odhcp6就是唯一管理ipv6的方式
- liyk: 这个方法获取的IPv6大概20分钟之后就会失效,默认路由先消失,然后Global IPV6再消失
- 海运: 不好意思,没有。
归档
- August 2025
- March 2025
- February 2025
- August 2024
- May 2024
- February 2024
- January 2024
- December 2023
- November 2023
- October 2023
- September 2023
- August 2023
- May 2023
- April 2023
- February 2023
- January 2023
- December 2022
- September 2022
- July 2022
- April 2022
- March 2022
- February 2022
- January 2022
- December 2021
- November 2021
- April 2021
- March 2021
- February 2021
- January 2021
- December 2020
- November 2020
- October 2020
- September 2020
- July 2020
- May 2020
- April 2020
- March 2020
- February 2020
- January 2020
- December 2019
- November 2019
- July 2019
- April 2019
- March 2019
- February 2019
- January 2019
- December 2018
- November 2018
- October 2018
- September 2018
- August 2018
- July 2018
- June 2018
- April 2018
- March 2018
- February 2018
- January 2018
- December 2017
- October 2017
- September 2017
- August 2017
- July 2017
- April 2017
- March 2017
- February 2017
- January 2017
- December 2016
- November 2016
- July 2016
- June 2016
- November 2015
- October 2015
- September 2015
- August 2015
- July 2015
- June 2015
- May 2015
- April 2015
- March 2015
- February 2015
- January 2015
- December 2014
- November 2014
- October 2014
- September 2014
- August 2014
- July 2014
- June 2014
- May 2014
- April 2014
- March 2014
- February 2014
- January 2014
- December 2013
- November 2013
- October 2013
- August 2013
- July 2013
- June 2013
- May 2013
- April 2013
- March 2013
- February 2013
- January 2013
- December 2012
- November 2012
- October 2012
- September 2012
- August 2012
- July 2012
- June 2012
- May 2012
- April 2012
- March 2012
- February 2012
- October 2011
- September 2011
- August 2011
- July 2011