2015年5月

Windows中搭建PHP扩展开发环境

一、提前准备

下载并安装VS2008

下载PHP5.4.5程序:

NTS下载

TS下载

其中php二进制包分为VC6、VC8、VC9及TS和NTS版本。

VC6、VC8、VC9分别对应VC6、VC2005、VC2008

TS表示(Thread Safe),当以ISAPI(IIS SERVER)允许时,因为是单进程中执行多线程,为避免内存泄漏和共享变量安全,建议使用TS版本。

当以FAST_CGI等以单一进程来执行,这样就无需进行线程的安全检查。

下载PHP5.4.5源码

下载PHP-SDK

下载MSYS,它包括Windows下linux编译器的实现

下载deps

下面的配置基础,以f:\php_stdio文件夹为基础

- 阅读剩余部分 -

CentOS6.5下安装apache+svn+php+svnadmin

在开发中,直接使用SVN管理代码,但是对于SVN服务器的搭建,以http访问以及svn的可视化管理不太了解。所以此次尝试搭建。在搭建的过程,遇到了一些问题,在网上找了一些资源,发现有些还是跟自己遇到的不一样,所以记录下遇到的问题以及解决方法。

一、安装Linux虚拟机

安装包:

VirtualBox-4.3.6-91406-Win.exe

CentOS-6.5-x86_64-bin-DVD1to2

安装过程略,装完后,发现使用SSH(SecureCRT)连接不上,可以相互ping通,修改虚拟机网络连接方式为桥接网卡可解决.

以下安装都是在Linux虚拟机上执行

- 阅读剩余部分 -

PHP中const和define()定义常量的细节区别

众所周知,在PHP中(PHP 4及以后),我们可以使用函数define()来定义常量,例如:

<?php
//定义一个名为PI的常量
define('PI', 3.14159);
echo PI;//输出:3.14159
?>

不过,在PHP 5.3.0之后,除了使用函数define()之外,我们还可以使用PHP关键字const来定义常量。

例如:

<?php
//以下代码需在PHP 5.3.0及之后的版本中运行
const PI = 3.14159; //使用const关键字定义一个名为PI的常量
echo PI; //输出:3.14159
?>

虽然上述两种方式均可以定义常量,但是它们之间有什么不同之处呢。下面我们来一一讲解PHP中define()函数和const关键字定义常量的区别:

1.版本差异

首先,毫无疑问的是,两种定义常量的方式之间存在版本差异,函数define()在PHP4和PHP5中均可使用,关键字const只能在PHP 5.3.0及其后的版本中使用。

- 阅读剩余部分 -

PHP扩展里函数的返回值

函数返回值

你也许会认为扩展中定义的函数应该直接通过return关键字来返回一个值,比如由你自己来生成一个zval并返回,就像下面这样:

ZEND_FUNCTION(sample_long_wrong) {
    zval *retval;
 
    MAKE_STD_ZVAL(retval);
    ZVAL_LONG(retval, 42);
 
    return retval;
}

但是,上面的写法是无效的!与其让扩展开发员每次都初始化一个zval并return之,zend引擎早就准备好了一个更好的方法。它在每个zif函数声明里加了一个zval*类型的形参,名为return_value,专门来解决返回值这个问题。在前面我们已经知道了ZEND_FUNCTION宏展开后是void name(INTERNAL_FUNCTION_PARAMETERS)的形式,现在是我们展开代表参数声明的INTERNAL_FUNCTION_PARAMETERS宏的时候了。

- 阅读剩余部分 -

PHP扩展里函数的参数

最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。 zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表着参数的个数。 紧接着需要传递给zend_parse_parameters()函数的参数是一个用于格式化的字符串,就像printf的第一个参数一样。下面表示了最常用的几个符号。

- 阅读剩余部分 -