分类 PHP 下的文章

Protobuf全称Google Protocol Buffers,Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

一、什么是序列化?
序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易。不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同,序列化为的是解决跨语言、跨平台的通讯问题。序列化后的数据当然不能是某种语言的特殊数据类型,常用的序列化协议有XML、JSON、Protobuf等。

  • 序列化: 将数据结构或对象转换成二进制串的过程。
  • 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

- 阅读剩余部分 -

编程语言的类型可分为强类型和弱类型两种,强类型变量声明时已确定变量类型,运行过程中不能随便将其他类型变量赋值于它(涉及到类型强制转换等除外),C/C++/Java属于强类型语言;而PHP/Python/JS属于弱类型语言,变量可以表示任意类型。本文介绍PHP变量的内部实现数据结构,如何表示各种数据类型。

1、PHP变量类型及存储结构
PHP虽然是弱类型语言,我们在使用时也会指明它的类型,比如bool/array/object/resource/null等。PHP底层使用C语言实现,变量的值存储到以下所示zval结构体中:

typedef struct _zval_struct zval;
struct _zval_struct {
    zvalue_value value;         /* 存储变量的值 */
    zend_uint refcount__gc;     /* 表示引用计数 */
    zend_uchar type;            /* 变量具体的类型 */
    zend_uchar is_ref__gc;      /* 表示是否为引用 */ 
};

变量类型type: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。

前面提到变量的值存储在zvalue_value联合体中,结构体定义如下:

typedef union _zvalue_value {
    long lval;                  /* long */
    double dval;                /* double */
    struct { 
        char *val;
        int len;
    } str;                      /* string*/
    HashTable *ht;              /* hash table */
    zend_object_value obj;      /* object */
} zvalue_value;

PHP的弱变量容器的实现方式是兼容并包的形式体现,针对每种类型的变量都有其对应的标记和存储空间。 使用强类型的语言在效率上通常会比弱类型高,因为很多信息能在运行之前就能确定,这也能帮助排除程序错误。 而这带来的问题是编写代码相对会受制约。

- 阅读剩余部分 -

PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果。 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回相应的运算结果。

1、一切的开始: SAPI接口
SAPI(Server Application Programming Interface)指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了PC的接口规范都可以在PC上正常运行, PHP脚本要执行有很多种方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。

最常见的四种启动PHP方式如下:

  • CLI/CGI模式调用;
  • 多进程模块;
  • 多线程模块;
  • 嵌入式,C程序中调用Zend Engine;

PHP开始执行以后会经过两个主要的阶段:处理请求之前的开始阶段和请求之后的结束阶段。 开始阶段有两个过程:第一个过程是模块初始化阶段(MINIT), 在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中), 该过程只进行一次。第二个过程是模块激活阶段(RINIT),该过程发生在请求阶段, 例如通过url请求某个页面,则在每次请求之前都会进行模块激活(RINIT请求开始)。

- 阅读剩余部分 -

很长时间没有认真的写篇文章,从今天开始正式学习PHP扩展开发,之前在Linux上也折腾过,只是认为在Linux上没有熟悉的C++ IDE,看PHP底层源码不方便,是转向Windows上部署环境,配合VS2010,源码查看、智能提示方便多了。PHP扩展开发是基于C语言,自己对C/C++比较熟悉,从扩展开发这个方向了解PHP Zend虚拟机底层实现应该是一条比较好的途径。本文主要介绍在Linux、Windows环境如何部署PHP扩展开发环境,以及我遇到的一些问题。

1、Linux平台环境配置
Linux平台配置过程很容易,本节以centos 4.3为例

  • step1:下载PHP源码包,并解压
  • step2:使用ext_skel生成工程框架./ext_skel --extname=myext

(1)在.h文件中声明导出函数:

PHP_FUNCTION(sqlapm);

- 阅读剩余部分 -

常用命令

1、git init 初始化本地快照
2、git remote add ssh://.... 配置远程库
3、git add files 添加文件夹或文件
4、git status 列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git commit)的文件
5、git commit -m "text..." 提交
6、git log 提交记录
7、git pull 拉取远程最新代码并merge(=fetch+merge)
8、git fetch 拉去最新代码(未合并)
9、git merge 合并代码
10、git push origin master 提价代码到远程master分支

常见问题

1、fatal: This operation must be run in a work tree?
git config --local --bool core.bare false

参考资料
1、Git远程操作详解
http://www.ruanyifeng.com/blog/2014/06/git_remote.html
2、常用 Git 命令清单
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html?utm_source=tool.lu
3、Git 工作流程
http://www.ruanyifeng.com/blog/2015/12/git-workflow.html
4、Git 使用规范流程
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html