- 博客(24)
- 资源 (2)
- 收藏
- 关注
原创 python实现连接池的简易代码
#coding:utf8import timeimport threadingclass Pool: def __init__(self,max): self._max = max self._connections = 0 self._lock = threading.Condition() self._cache = [] def get(self): try:
2021-03-22 16:32:30
411
原创 centos6 系统slab内存一直线性增长
centos6 系统slab内存一直线性增长一、问题描述二、 问题追踪1).查看各进程占用的内存情况2). 查看内存使用分布情况a). 运行```cat /proc/meminfo```命令查看内存使用分布情况。b). 运行```slabtop```查看slab分布。c).查看slab dentry状态。d).strace追踪三、解决办法1). 通过脚本修改内核参数,定时清理空间。但这种办法治根不治本,笔者不太推荐。2). 升级到更高版本的nss版本。3). 目前很多网站的https采用openssl密码库
2020-07-09 11:26:19
1448
原创 PHP - 类自动加载机制
PHP类自动加载机制被广泛运用到各个PHP框架中,在面向对象开发中,使用一套自动加载机制来管理我们的类库将会非常方便,从而减少使用前逐个引入包文件的痛苦。PHP提供了两种注册自动加载的方式:__autoload 和 spl_autoload_register。下面将介绍这两个函数在PHP的实现。__autoload 当我们在PHP脚本定义__autoload函数时,PHP在编译阶段调用zend_d
2017-01-15 10:58:36
752
原创 PHP - FPM信号机制
熟悉PHP-FPM的童鞋应该都知道它采用master/worker多进程架构设计,我们可以通过执行"xxx/sbin/php-fpm stop"或"xxx/sbin/php-fpm reload"停止或重新加载fpm。那么它究竟是怎样运作呢?简单来说,其运用了信号机制来实现相应的功能。当我们执行"stop"命令时,系统向fpm进程发送停止信号,当我们执行"reload"命令时,系统向fpm进程发送SIGUSR
2017-01-06 20:50:32
2265
原创 PHP - 垃圾回收机制
关于PHP垃圾回收机制(简称GC),网上已经有很多相关资料。之所以决定写这篇文章,主要是为了加深自己对PHP垃圾回收机制的理解。当然,如果能帮助到其他人理解,也不失为一件快事。 PHP5.3及以上版本使用了新垃圾回收机制。我们可以通过修改php.ini配置开启或关闭GC机制(默认是打开状态)。zend.enable_gc = OnGC数据结构typedef struct _gc_root_buff
2016-12-31 21:33:09
773
原创 Redis2.6 - publish/subscribe的BUG
前一段时间由于业务需要,我们需要搬迁服务器到新机房。为了保证系统平滑过渡,我们分成多批搬迁。迁移工作总体还算顺利,期间也遇到了一点点小挫折。下面将介绍我印象最为深刻的一个BUG:redis2.6的publish/subscribe。进入主题,首先介绍下业务场景及问题。业务场景我们生产环境使用的redis是2.6版本,redis集群只有两台服务器,一主(A)一从(B)。 制定的redi
2016-12-30 20:19:41
1410
原创 PHP - 内存管理
前面几篇文章主要介绍PHP-FPM,沿着”FPM运行原理->运行模式->进程管理->定时事件”方向,我们对FPM已经有了一个较为深刻的认识。今天这篇文章将介绍PHP的另一核心功能,内存管理。很多开源软件都有一套自己维护的内存管理体系,例如,nginx。php作为世界上“最好”的语言,当然也不例外。PHP内存管理功能,简单来说,就是申请一块大的内存来管理自己的内存结构;代码非常之精巧,其使用“内存对齐
2016-12-25 15:24:53
861
原创 PHP-max_execution_time与fpm.request_terminate_timeout介绍
前段时间一位同事跟我说php脚本超时时间以fpm配置优先。经过自己测试后,其实不然,上面的观点只是在某些情况下成立。php脚本超时时间可以在php.ini的max_execution_time和fpm.conf的request_terminate_timeout参数两处进行设置.那么这两者有什么区别呢?当我们设置php.ini的max_execution_time参数后,zend引擎处理脚本时,其内
2016-12-17 17:30:53
7865
原创 PHP源码分析 - PHP-FPM定时事件
PHP-FPM分别使用IO和定时两种事件来保证系统流畅的运转。IO事件负责收集客户端请求、主进程及子进程信号等操作。定时事件负责辅助型任务的处理,其内部定义fpm_pctl_perform_idle_server_maintenance_heartbeat 和 fpm_pctl_heartbeat两个定时事件,fpm_pctl_perform_idle_server_maintenance_hea
2016-12-07 11:57:16
1186
原创 PHP源码分析 - PHP-FPM scoreboard模块介绍
fpm_scoreboard(以下简称scoreboard模块)是PHP-FPM核心功能之一,源码位于sapi/fpm/fpm_scoreboard.c。从字面意思理解是一个”记分器”,也就是说它是一个类似统计功能的模块。网上关于这方面的资料较少,经过不断地反复阅读以及推敲,脑海中已经有了一个比较清晰的轮廓。scoreboard模块定义fpm_scoreboard_s和fpm_scoreboard_
2016-11-30 21:56:39
2582
原创 PHP源码分析 - PHP-FPM运行模式详解
前篇文章已经介绍PHP-FPM的运行原理。本文将细说PHP-FPM的运行模式。实际上,在上一篇文章简单提到过FPM运行模式,之所以把这块内容拉出单独讲解,笔者认为它是一个值得学习及借鉴的地方。FPM支持static、ondemand、dynamic三种运行模式。我们可以通过修改php-fpm.conf配置文件中的pm参数进行设置.static模式static:又称静态模式,该模式比较容易理解,即启动
2016-11-30 10:42:27
1921
原创 PHP源码分析 - PHP-FPM运行原理
其实很早之前就有想过阅读PHP源码,主要还是自己比较懒散,意志不够坚定,一直无法静下心。最近不是很忙,趁着“短暂”的闲暇之余,翻看尘封已久的“PHP源码”文件。我们知道web服务器与PHP应用之间通过SAPI接口进行交互数据。PHP提供了多种SAPI接口,例如 apache2hander、fastcgi、cli等等。当然,php-fpm也是其中一种。相比其他结构,php-fpm运用更加广泛,这
2016-11-23 21:11:15
14730
1
原创 CodeIgniter-内部运行流程
每当我们阅读一个优秀的框架/项目时,先要理清它的整个运行流程,才能掌握和理解它的真正设计含义。CodeIgniter(简称:CI)作为一款优秀的轻量级PHP框架,其特点:简洁又不失灵活。它的内部运作原理又是怎样的呢?CI的入口文件为index.php,核心代码位于system/Core/CodeIgniter.php.以下为笔者整理的CI运行流程图及部分主要模块的说明。初始化系统运行环境 a).
2016-11-19 19:43:43
908
原创 CodeIgniter-&引发关于变量引用的思考
CodeIgniter是一个单例模式框架,源代码中大量使用‘&’引用,有两种原因:一方面基于兼容PHP4版本;另一方面是为了防止变量发生”写时复制”(copy on write)。借此机会,简单地介绍“PHP变量引用”原理。PHP源码使用zval结构定义变量:typedef struct _zval_struct zval;struct _zval_struct { zvalue_valu
2016-11-19 10:43:41
534
原创 CodeIgniter-Security的CSRF hash生成功能
Security/get_random_bytes()的功能是随机生成字符串,用于crsf验证的hash值。```phppublic function get_random_bytes($length){if (empty($length) OR ! ctype_digit((string) $length)){return FALSE;}// Unfort
2016-11-11 11:57:26
669
原创 CodeIgniter-Router的BUG(3.0.0版本)
好久没有更新Blog了,前一段时间在研究nginx源码。相比redis,nginx的代码量要多几倍,结构也比较复杂,稍后将补充nginx的源码分析。在研究nginx的同时,笔者也开始着手阅读CodeIgniter源码。CodeIgniter是一款非常流行且轻量级的框架。CodeIgniter,设计灵活,扩展性强,低耦合。在阅读源码CodeIgniter3.0.0的时候,笔者发现Router.php的
2016-11-05 20:56:05
833
原创 linux僵尸进程
定义僵死进程是指子进程退出时,父进程并未对其发出的SIGCHILD信号进行适当处理,导致子进程停留在僵死状态等待其父进程为其收尸,这个状态下的子进程就是僵死进程。实例#include<stdio.h>#include<stdlib.h>#include<error.h>int main(int argc,char *argv[]){ int pid,i; pid =
2016-09-18 16:38:10
592
原创 redis源码分析-intset(整型集合)
intset,一种特殊的set数据结构,由多个整型元素组成。intset也是一个有序整型集合,其内部设计非常精巧。intset数据结构与往常一样,先了解intset数据结构:typedef struct intset { uint32_t encoding; uint32_t length; int8_t contents[];} intset;intset结构由encod
2016-08-13 10:24:37
3942
1
原创 python之sched
sched是python的任务调度类库。所谓任务调度,就是根据任务的先后及优先级顺序执行。sched的使用这里就不介绍了,大家可以参考官方文档(https://docs.python.org/2.6/library/sched.html)。本文的重点将介绍sched的内部运作原理。sched内部原理sched是类库的名称,实际上,sched内部封装了一个scheduler类,用于负责任务的新增、取消
2016-08-02 09:15:34
1369
原创 redis源码分析-ziplist(压缩链表)
ziplist结构在redis运用非常广泛,是列表、字典等数据类型的底层结构之一。ziplist的优点在于能够一定程度地节约内存。ziplist构成ziplist结构由zip_header、zip_entry、zip_end三部分组成。ZIP_HEADER:顾名思义,压缩列表的头部。内部包含ZIP_BYTES、ZIP_TAIL、ZIP_LENGTH属性。
2016-07-31 11:20:39
1676
原创 redis源码分析-dict(字典结构)
—、简介众所周知,字典是采用哈希表结构实现的。redis也不例外,代码位于dict.c 和 dict.h。为了解决hash键冲突的问题,redis采用“拉链式”进行设计。 由于网上有大量的hash结构及相关操作说明,笔者将不再介绍。本文的重点主要讲解dict的数据结构、运作流程及rehash实现。二、数据结构redis字典由dictEntry(节点)、dictType(类型)、dic
2016-07-18 21:18:57
827
原创 redis源码分析-adlist(链表)
一、介绍上一节,介绍了sds结构,接下来将介绍下redis的adlist(又称链表).redis的链表采用双向链表方式进行实现,代码位于src/adlist.h、src/adlist.c .二、数据结构C语言数据结构中双向链表结构由节点(listNode)、迭代器(listIterator)、容器(list)组成,redis也是如此。节点typedef struct listNode {
2016-07-10 17:22:59
600
原创 redis源码分析-sds字符串
介绍等待简易动态的sds字符串1.介绍在c语言中,一般使用char*定义字符串类型,但redis却采用sds结构保存字符串。那么redis为什么弃用char而改用sds呢?这样做是基于哪方面的考虑?这样做的优点又有哪些呢?2.char与sds比较首先,回到原点,我们看下sds的数据结构(以下为3.0版本代码)。struct sdshdr { int len
2016-07-04 21:25:19
578
(高性能PHP应用开发.pdf
2017-03-20
深入PHP面向对象、模式与实践_第三版
2017-03-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人