Redis RDB 文件存储实现
redis通过把内存数据保存为rdb文件来实现快照,是整个redis内核中不可缺少的一部分,为实现服务高可用提供了强有力的支撑。有以下2点作用:1. 持久化 (比 aof 恢复速度更快,也占用更小的磁盘空间,因此作为默认的持久化方式)
2. 主从同步 (开启主从后,需要首先把master上的历史数据同步到slave,这时slave就会拉取master的rdb文件,然后解析加载rdb文件到内存)
如何使用C++开发PHP扩展(下)
上文中介绍了使用C++编写简单PHP扩展的方法,但是更多的情况是业务中已经有独立的 api 库,形式为 libxxx.a / libxxx.so,PHP程序中需要调用这些 api,所以这时就要编写PHP扩展来实现。这时是使用静态库 libxxx.a ,还是使用 libxxx.so 呢 ?常见的做法是使用静态库 libxxx.a ,下面一步一步介绍:
如何使用C++开发PHP扩展(上)
目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案。当然“如何开发PHP扩展”的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的介绍。C++编程语言功能的强大,促使好多公司后台程序选择使用它,因此碰到的大多数情况是需要我们用C++来扩展 PHP。PHP源码中的扩展骨架工具,默认生成的是支持 C 语言,如果要使用C++开发,有些参数需要另行配置。下面将用一个简单的示例来说明。
C++动态库和静态库
静态库、动态库均指可复用、可独立功能程序代码的集合。静态库是在链接阶段把库代码包含入可执行文件的方式,动态库是在执行阶段把库代码引入可执行文件的方式。
静态库只需保证在开发者的计算机有正确的库文件,生成的可执行文件体积较大。当初正是为了避免此问题,才开发了动态库技术。各有各的长处,各有各的短肋。针对不同的情况,选择不同的方式吧。
编译PHP扩展的两种方式
编译的两种方式其实很简单,这里记录只是为了以后遇到这种情况时不加思索地运用上,而不是花费一些时间去回忆。
C/C++程序编译有两种方式:动态编译、静态编译。PHP 是使用 C/C++程序开发的一门脚本语言,其扩展编译也就脱离不了前面提到的两种,动态、静态。站在PHP程序的角度,动态编译就是扩展生成一个 .so 文件,然后在 php.ini 中加载这个 .so 文件,此时即可调用其中的函数或者是类方法;静态编译就是在安装 PHP 时把其扩展文件内容编译到 PHP 内部,然后不需要做任何事情,就可以直接调用其中的函数或者还是类方法。这二者有什么优缺点呢?采用静态编译方式,程序在调用其函数/类方法时要快一些;采用动态编译方式,在有新扩展需要添加到PHP中时不需要重新编译PHP,只需要编译该扩展下的文件,然后把 .so 文件引入即可。二者均有利弊,使用时视情况而定是最好的方法。下面用Linux 平台下的操作来说明其编译过程。
程序员如何面对需求变化
在工作中也接触过各种各样的项目,有的注重时间,有的注重质量,有的注重成本。有些项目会随着时间的推移侧重点会有所改变,比如刚开始可能注重质量、后来开始注重成本、最后可能注重时间,因此在这个变化中项目经理为了整体把控好这个项目,一些需求的变动也是再所难免。即使没有上面说的这些情况,一个项目从开始到结尾,需求的变化肯定是会有的。对于互联网行业,一个新产品的出现往往会立为一个项目,这里主要也是针对这样项目来进行描述。产品需求需求变化意味着什么,意味着程序要要不停的修改之前编写的代码,同时也就意味着不能按时下班。那么程序员怎么才能够更好的应对产品的这些快速的需求变化呢?于是乎,业界的高人提到了敏捷、迭代,但是真正能运用好,还是要经过千锤百炼。
C++五种内存分配方法的区别
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法)