<?php
//获得信号量的方法
$execute = function () {
//(1).创建IPC通信KEY
$key = ftok(__FILE__, 'a');
//(2).获取一个信号量资源句柄
$sem_handler = sem_get($key, 1);
if (sem_acquire($sem_handler, false)) {
echo '进程' . getmypid() . '获得信号量' . PHP_EOL;
//模拟业务执行
sleep(5);
//释放信号量(sem_get函数默认自动释放)
sem_release($sem_handler);
} else {
echo '进程' . getmypid() . '未获得信号量' . PHP_EOL;
}
};
//父进程执行函数
$mainFunc = function ($pid) {
sleep(10);
echo "10秒后所有进程跟我一起死" . PHP_EOL;
};
//(3).模拟父子进程抢占信号
$pid = pcntl_fork();
if ($pid == -1) {
throw new Exception('创建子进程失败');
} elseif ($pid) {
//父进程获取信号量
$execute();
} else {
//子进程获取信号量
$execute();
}//提示:
//1.sem_get函数默认设置为最多1个进程可以获取信号量,所以实现了锁的效果
//2.配合sem_acquire函数的no_wait参数实现阻塞或者非阻塞
//3.整体的效果和文件锁完全一样,但是比文件锁性能更好
PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts { public f...
ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...
主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /** * 订单任务 */ class Order { &n...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...
经常我们下载国外资源容易被墙,可以通过php脚本获取远程文件流然后输出给我们的浏览器来下载。<?php //设置下载文件的url $url = 'https://mirrors.huaweicloud.com/ubuntukylin/ubuntukylin-19....
php event扩展在windows中依赖于php_sockets扩展,因此在php.ini中必须先加载php sockets扩展,如下。extension=sockets extension=event...