config.m4一点笔记

静态编译

即不生成so动态转载文件,而是编译进PHP中。

使用./configure --help可以查看到会被静态编译进PHP的扩展,当然即使扩展出现在该列表中,你依然可以使用--with-extName=shared使其编译为动态模块。

执行./buildconf --force命令重新生成configure文件,但请将你要静态编译进PHP的扩展放到phpsrc/ext目录下。


Read more...

2014-02-19 PHP扩展

GoLang 基础笔记

字符串

  1. 使用”和`定义,类型:string;
  2. 无法修改(类似C语言中的字符串常量char *str="Hello");
  3. 可进行切片操作,例如:str[startIndex:endIndex+1]

Read more...

2014-02-16 GoLang基础

SSO 实现方案探讨

本博文主要针对多个相互信任的网站实现单点login后其它站点也login,单点logout后其它站点也logout的解决方案。

本方案学习自:Simple Single Sign-On for PHP (Ajax compatible),但实现方式与之有些不同:

  1. Broker可以存储用户信息,这样,当用户在登陆Broker之后所进行的操作都不需要请求SSO以检查用户是否退出了;
  2. 当用户从某个Broker退出时,该Broker先自己执行用户退出工作,之后发送退出请求到SSO,SSO通知其它已经登陆了的Broker执行退出工作。

Read more...

2014-02-14 PHP应用

urlencode和rawurlencode区别

urlencode():用于编码URL中的参数部分。 rawurlencode():用于编码URL路径部分。
Read more...


2014-02-12 PHP应用

PHP foreach 是如何遍历数组的?

参考资料:How foreach actually worksPHP的哈希表实现

Array类型的实现


在PHP的zvalue_value结构体中,我们知道array类型是通过HashTable实现的,结构如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct _hashtable { 
    uint nTableSize;        // hash Bucket的大小,最小为8,以2x增长。
    uint nTableMask;        // nTableSize-1 , 索引取值的优化
    uint nNumOfElements;    // hash Bucket中当前存在的元素个数,count()函数会直接返回此值 
    ulong nNextFreeElement; // 下一个数字索引的位置
    Bucket *pInternalPointer;   // 当前遍历的指针(foreach比for快的原因之一)
    Bucket *pListHead;          // 存储数组头元素指针
    Bucket *pListTail;          // 存储数组尾元素指针
    Bucket **arBuckets;         // 存储hash数组
    dtor_func_t pDestructor;    // 在删除元素时执行的回调函数,用于资源的释放
    zend_bool persistent;       //指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。
    unsigned char nApplyCount; // 标记当前hash Bucket被递归访问的次数(防止多次递归)
    zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次
#if ZEND_DEBUG
    int inconsistent;
#endif
} HashTable;

Bucket *pInternalPointer;就是foreach用于遍历Bucket的指针,数组的每一个元素都存储在Bucket,它比for快,因为for需要对key进行哈希后,才能找到相应节点。


Read more...

2014-02-08 PHP底层

PHP变量引用计数,写时复制总结

学习自php-variables

在PHP的变量存储结构ZVAL中,有两个成员:refcount__gcis_ref_gc用于实现引用计数和写时复制,这样既能节省内存,又能减少计算量。

当执行如下代码时:

1
2
3
4
5
<?php
$a = "this is";
$b = "variable";
$c = 42;
?>

三个变量各自拥有一个ZVAL,如下图所示:
demo


Read more...

2014-01-28 PHP扩展

GRASP (object-oriented design)

翻译自维基百科GRASP (object-oriented design)

General Responsibility Assignment Software Patterns(通用职责分配软件模式),简写为GRASP,由面向对象设计中对类和对象的职责分配原则组成。

GRASP使用的模式和原则有:控制器、创建者、间接性、信息专家、高内聚、低耦合、多态、防止变异和纯虚构。所有这些模式都回答了一些软件设计问题,并且这些问题几乎在每一个软件开发项目中都会遇到。这些技术还没有被用来发明新的工作方式,而是为了改善文档和规范旧的开发方式,是在面向对象设计中不断尝试和测试的编程原则。

Larman说:“软件开发中最关键的设计工具是一个在设计原则上受过良好教育的头脑,而不是UML或者其它技术。”因此,GRASP是一个真正的思维工具,一个学习援助,在面向对象软件的设计中有所帮助。


Read more...

2014-01-25 设计模式