PHP开发第一个扩展

独立的 PHP 扩展可以独立于 PHP
源码之外进行分发。要创建一个这样的扩展,需要准备好两样东西:

概述

首先声明:我们要构建的是扩展或者模块名为hello_module.该模块提供一个方法:hello_word.

  • 配置文件 (config.m4)
  • 你的模块源码

        
Lamp架构是目前成熟的网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态web站点服务及其应用开发环境。

一、PHP环境的搭建

接下来我们来描述一下如果创建这些文件并组合起来。

组成:Linux 、Apache、MySQL、php/perl/pytho

1)一般使用源码包编译安装,而不是binary包安装。因为使用PHP的二进制分发包安装有些冒险,这些版本倾向于忽略./configure的两个重要选项,它们在开发过程中很便利:

准备好系统工具

想要扩展能够在系统上编译并成功运行,需要准备转以下工具:

  • GNU autoconf
  • GNU automake
  • GNU libtool
  • GNU m4

以上这些都可以从 获取。

注:以上这些都是类 Unix 环境下才能使用的工具。

优势:成本低廉、可定制、易于开发、方便易用、安全和稳定

第一个–enable-debug。这个选项将把附加的符号信息编译进PHP的执行文件,以便如果发生段错误,你能从中得到一个内核转储文件,使用gdb追踪并发现什么地方以及为什么会发生段错误。

改装一个已经存在的扩展

为了显示出创建一个独立的扩展是很容易的事情,我们先将一个已经内嵌到 PHP
的扩展改成独立扩展。安装 PHP 并且执行以下命令:

$ mkdir /tmp/newext
$ cd /tmp/newext

现在你已经有了一个空目录。我们将 mysql 扩展目录下的文件复制过来:

$ cp -rp php-4.0.X/ext/mysql/* .
# 注:看来这篇 README 真的需要更新一下了
# PHP7 中已经移除了 mysql 扩展部分

到这里扩展就完成了,执行:

$ phpize

现在你可以独立存放这个目录下的文件到任何地方,这个扩展可以完全独立存在了。

用户在编译时需要使用以下命令:

$ ./configure 
       [--with-php-config=/path/to/php-config] 
       [--with-mysql=MYSQL-DIR]
$ make install

这样 MySQL 模块就可以使用内嵌的 MySQL 客户端库或者已安装的位于 MySQL
目录中的 MySQL。

注:意思是说想要编写 PHP 扩展,你既需要已经安装了 PHP,也需要下载一份
PHP 源码。

 

2)另
一个选项依赖于你的PHP版本。在PHP
4.3中该选项名为–enable-experimental-zts,在PHP
5及以后的版本中为–enable-maintainer-zts。这个选项使PHP以为自己执行于多线程环境,并且使你能捕获通常的程序错误,然而它
们在非多线程环境中是无害的,却使你的扩展不可安全用于多线程环境。一旦你已经使用这些额外的选项编译了PHP并安装于你的开发服务器(或者工作站)中,你就可以把你的第一个扩展加入其中了。

定义一个新扩展

我们给示例扩展命名为 “foobar”。

新扩展包含两个资源文件:foo.c 和
bar.c(还有一些头文件,但这些不只重要)。

示例扩展不引用任何外部的库(这点很重要,因为这样用户就不需要特别指定一些编译选项了)。

LTLIBRARY_SOURCES
选项用于指定资源文件的名字,你可以有任意数量的资源文件。

注:上面说的是 Makefile.in 文件中的配置选项,可以参考
xdebug。

(1)准备工作

3)Zend
引擎提供了一个内存管理器,有在扩展中跟踪内存泄漏的能力并提供详尽的调试信息。跟踪在默认情况下是被禁用的,同时也是线程安全的。要打开的话,应将
–enable-debug 和 –enable-maintainer-zts 选项与其他常用选项一起传给
configure。要获得从源代码构建 PHP 的说明,请看位于 安装前需要考虑的事项
的说明。

修改 m4 后缀的配置文件

m4
配置文件可以指定一些额外的检查。对于一个独立扩展来说,你只需要做一些宏调用即可。

PHP_ARG_ENABLE(foobar,whether to enable foobar,
[  --enable-foobar            Enable foobar])

if test "$PHP_FOOBAR" != "no"; then
  PHP_NEW_EXTENSION(foobar, foo.c bar.c, $ext_shared)
fi

PHP_ARG_ENABLE 会自动设置好正确的变量以保证扩展能够被
PHP_NEW_EXTENSION 以共享模式启动。

PHP_NEW_EXTENSION
的第一个参数是扩展的名称,第二个参数是资源文件。第三个参数 $ext_shared
是由 PHP_ARG_ENABLE/WITHPHP_NEW_EXTENSION 设定的。

请始终使用 PHP_ARG_ENABLEPHP_ARG_WITH
进行设置。即使你不打算发布你的 PHP 模块,这些设置也可以保证让你的模块和
PHP 主模块的接口保持一体。

注:PHP_ARG_ENABLEPHP_ARG_WITH
应该是用于定义模块是动态扩展还是静态编译进 PHP 中,就跟编译 PHP 时使用的
--enable-xxx--with-xxx 一样。

[root@crushlinux ~]# service  iptables stop               //关闭防火墙
[root@crushlinux ~]# setenforce 0                        //关闭seLinux

典型的 configure
命令行可能看起来象这样:

创建资源文件

ext_skel 可以为你的 PHP
模块创建一些通用的代码,你也可以编写一些基本函数定义和 C
代码来处理函数的参数。具体信息可以查看
READNE.EXT_SKEL。

不要担心没有范例,PHP
中有很多模块供你参考,选择一个简单的点开始,添加你自己的代码。

注:ext_skel
可以生成好基本模块需要的资源文件和配置文件,不需要自己创建。

(2)确认没有使用以rpm方式安装的httpd、MySQL及PHP

$ ./configure 
--prefix=/usr/local/php 
--enable-debug 
--enable-maintainer-zts  
--enable-cgi 
--enable-cli 
--with-mysql=/path/to/mysql 

修改自定义模块

将 config.m4 文件和资源文件放到同一个目录中,然后执行 phpize (PHP 4.0
以上的版本编译 PHP 的时候都安装了 phpize)。

如果你的 phpize 不在系统环境变量中,你需要指定绝对路径,例如:

$ /php/bin/phpize

这个命令会自动复制必需的构建文件到当前目录并根据 config.m4
创建配置文件。

通过以上的步骤,你已经有了一个独立的扩展了。

[root@crushlinux ~]# rpm -e httpd httpd-manual webalizer subversion mod_python mod_ssl mod_perl system-config-httpd php php-cli php-ldap php-common php-mysql  mysql-server mysql dovecot –nodeps

1)一般可以把php安装在/usr/local/php目录下。
2)php的二进制可执行文件都在/usr/local/php/bin目录,包括php自带工具phpize.

安装扩展

扩展可以通过以下命令编译安装:

$ ./configure 
            [--with-php-config=/path/to/php-config]
$ make install

安装

phpize实际上是个shell脚本,可以用vi
phpize来查看其内容.
注意:使用phpize需要安装autoconf
宏。因为config.m4 文件使用 GNU autoconf
语法编写。简而言之,就是用强大的宏语言增强的 shell脚本。注释用字符串 dnl
分隔,字符串则放在左右方括号中间(例如,[ 和
])。字符串可按需要多次嵌套引用。完整的语法参考可参见位于
安装autoconf
宏最简单的方法:apt-get install autoconf

给模块添加共享支持

有时候独立扩展需要是共享的已供其他模块加载。接下来我会解释如何给已经创建好的
foo 模块添加共享支持。

  1. 在 config.m4 文件中,使用 PHP_ARG_WITH/PHP_ARG_ENABLE
    来设定扩展,这样就可以自动使用 --with-foo=shared[,..]
    --enable-foo=shared[,..] 这样的指令作为编译参数了。
  2. 在 config.m4 文件中,使用 PHP_NEW_EXTENSION(foo,.., $ext_shared)
    使扩展可以被构建。
  3. 添加以下代码到你的 C 语言资源文件中:

   #ifdef COMPILE_DL_FOO
   ZEND_GET_MODULE(foo)
   #endif

这一段讲的上面都提到过了,这里只是又强调了一下。

 

 

PECL 网站约定

如果你打算发布你的扩展到 PECL 的网站,需要考虑以下几点:

  1. 添加 LICENSE 或 COPYING 到 package.xml
  2. 需要在扩展头文件中定义好版本信息,这个宏会被 foo_module_entry
    调用来声明扩展版本:

   #define PHP_FOO_VERSION "1.2.3"

安装httpd

2、ext_skel脚本

1、下载apache

PHP
扩展由几个文件组成,这些文件对所有扩展来说都是通用的。不同扩展之间,这些文件的很多细节是相似的,只是要费力去复制每个文件的内容。幸运的是,有脚本可以做所有的初始化工作,名为
ext_skel,自 PHP 4.0 起与其一起分发。

wget http://archive.apache.org/dist/httpd/httpd-2.2.17.tar.gz

不带参数运行 ext_skel
在 PHP 5.3.2 中会产生以下输出:

2、解压压缩包

./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]  
           [--skel=dir] [--full-xml] [--no-help]  
  --extname=module   module is the name of your extension  
  --proto=file       file contains prototypes of functions to create  
  --stubs=file       generate only function stubs in file  
  --xml              generate xml documentation to be added to phpdoc-cvs  
  --skel=dir         path to the skeleton directory  
  --full-xml         generate xml documentation for a self-contained extension  
                     (not yet implemented)  
  --no-help          don't try to be nice and create comments in the code  
                     and helper functions to test if the module compiled  
tar xf httpd-2.2.17.tar.gz

 

3、编译源码包,并且安装

开发一个新扩展时,仅需关注的参数是
–extname 和 –no-help。除非已经熟悉扩展的结构,不要想去使用 –no-help;
指定此参数会造成 ext_skel
不会在生成的文件里省略很多有用的注释。

(1)cd httpd-2.2.17
    (2)./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi

剩下的 –extname
会将扩展的名称传给 ext_skel。”name”
是一个全为小写字母的标识符,仅包含字母和下划线,在 PHP 发行包的 ext/
文件夹下是唯一的。

澳门新浦京电子游戏 1

–proto选项允许开发人员指定一个头文件,由此创建一系列
PHP
函数,表面上看就是要开发基于一个函数库的扩展,但对大多数头现代的文件来说很少能起作用。如果用
zlib.h 头文件来做测试,就会导致在 ext_skel
的输出文件中存在大量的空的和无意义的原型文件。–xml 和 –full-xml
选项当前完全不起作用。–skel
选项可用于指定用一套修改过的框架文件来工作,这是本节范围之外的话题了

编译完成后,如上图,说明已经编译成功

 

如果出现以下错误

3、扩展组成文件

则在编译时加入–with-included-apr即可。

不管是通过手工,通过ext_skel
,还是通过另外的扩展生成器,所有的扩展都会有以下个文件:
1) 
config.m4:phpize

–prefix=:指定安装目录

用来准备构建系统哪些扩展的配置文件configure
选项 ,是UNIX 构建系统配置。
对应的win系统是config.w32:
2)
php_澳门新浦京电子游戏,hello_module.h:

–enable-so:启用动态加载模块支持,使httpd具备进一步扩展功能的能力

包含引用的头文件当将扩展作为静态模块构建并放入PHP
二进制包时,构建系统要求用 php_ 加扩展的名称命名的
头文件包含一个对扩展模块结构的指针定义。就象其他头文件,此文件经常包含附加的宏、原型和全局量。当然你可以把头文件内容放在源文件hello_module.c顶部。分开只是让代码组织更清晰,而且是个很好的习惯。
3)
hello_module.c :
包含模块函数的源码文件

–enable-rewrite::启用网页地址重写功能,用于网站优化及目录迁移维护。(如果访问网站未找到,将自动跳转到其他网页)

扩展应包含任意数量的头文件、源文件、单元测试和其他支持文件,此四个文件仅够组成最小的扩展。hello_module扩展的文件列表如下所示:

–enable-charset-lite:启动字符集支持,以便支持使用各种字符集编码的网页。

ext/hello_module/  
config.m4        
config.w32        
CREDITS        
EXPERIMENTAL       
php_hello_module.h        
hello_module.c        
tests/         
001.phpt 

–enable-cgi:启用CGI脚本程序支持,以便于网站的应用访问能力

 

–help:帮助信息

4、与 UNIX 构建系统交互: config.m4

 

 

4.安装

config.m4文件负责在配置时解析configure的命令行选项。这就是说它将检查所需的外部文件并且要做一些类似配置与安装的任务。config.m4
文件告诉 UNIX 构建系统哪些扩展 configure
选项是支持的,你需要哪些扩展库,以及哪些源文件要编译成它的一部分。对所有经常使用的
autoconf 宏,包括 PHP 特定的及 autoconf 内建的,
config.m4
文件举例

make && make install

dnl $Id$  
dnl config.m4 for extension example  
PHP_ARG_WITH(example, for example support,  
[  --with-example[=FILE]       Include example support. File is the optional path to example-config])  
PHP_ARG_ENABLE(example-debug, whether to enable debugging support in example,  
[  --enable-example-debug        example: Enable debugging support in example], no, no)  
PHP_ARG_WITH(example-extra, for extra libraries for example,  
[  --with-example-extra=DIR      example: Location of extra libraries for example], no, no)  

dnl 检测扩展是否已启用  
if test "$PHP_EXAMPLE" != "no"; then  

dnl 检测 example-config。首先尝试所给出的路径,然后在 $PATH 中寻找  
AC_MSG_CHECKING([for example-config])  
EXAMPLE_CONFIG="example-config"  
if test "$PHP_EXAMPLE" != "yes"; then  
EXAMPLE_PATH=$PHP_EXAMPLE  
else  
EXAMPLE_PATH=`$php_shtool path $EXAMPLE_CONFIG`  
fi  

dnl 如果找到可用的 example-config,就使用它  
if test -f "$EXAMPLE_PATH" && test -x "$EXAMPLE_PATH" && $EXAMPLE_PATH --version > /dev/null 2>&1; then  
AC_MSG_RESULT([$EXAMPLE_PATH])  
EXAMPLE_LIB_NAME=`$EXAMPLE_PATH --libname`  
EXAMPLE_INCDIRS=`$EXAMPLE_PATH --incdirs`  
EXAMPLE_LIBS=`$EXAMPLE_PATH --libs`  

dnl 检测扩展库是否工作正常  
PHP_CHECK_LIBRARY($EXAMPLE_LIB_NAME, example_critical_function,  
[  
  dnl 添加所需的 include 目录  
  PHP_EVAL_INCLINE($EXAMPLE_INCDIRS)  
  dnl 添加所需的扩展库及扩展库所在目录  
  PHP_EVAL_LIBLINE($EXAMPLE_LIBS, EXAMPLE_SHARED_LIBADD)  
],[  
  dnl 跳出  
  AC_MSG_ERROR([example library not found. Check config.log for more information.])  
],[$EXAMPLE_LIBS]  
)  
else  
dnl 没有可用的 example-config,跳出  
AC_MSG_RESULT([not found])  
AC_MSG_ERROR([Please check your example installation.])  
fi  

dnl 检测是否启用调试  
if test "$PHP_EXAMPLE_DEBUG" != "no"; then  
dnl 是,则设置 C 语言宏指令  
AC_DEFINE(USE_EXAMPLE_DEBUG,1,[Include debugging support in example])  
fi  

dnl 检测额外的支持  
if test "$PHP_EXAMPLE_EXTRA" != "no"; then  
if test "$PHP_EXAMPLE_EXTRA" == "yes"; then  
  AC_MSG_ERROR([You must specify a path when using --with-example-extra])  
fi  

PHP_CHECK_LIBRARY(example-extra, example_critical_extra_function,  
[  
  dnl 添加所需路径  
  PHP_ADD_INCLUDE($PHP_EXAMPLE_EXTRA/include)  
  PHP_ADD_LIBRARY_WITH_PATH(example-extra, $PHP_EXAMPLE_EXTRA/lib, EXAMPLE_SHARED_LIBADD)  
  AC_DEFINE(HAVE_EXAMPLEEXTRALIB,1,[Whether example-extra support is present and requested])  
  EXAMPLE_SOURCES="$EXAMPLE_SOURCES example_extra.c"  
],[  
  AC_MSG_ERROR([example-extra lib not found. See config.log for more information.])  
],[-L$PHP_EXAMPLE_EXTRA/lib]  
)  
fi  

dnl 最后,将扩展及其所需文件等信息传给构建系统  
PHP_NEW_EXTENSION(example, example.c $EXAMPLE_SOURCES, $ext_shared)  
PHP_SUBST(EXAMPLE_SHARED_LIBADD)  
fi  

 

 

5.优化执行路径

注意:凡是带有dnl前缀的都是注释,注释是不被解析的。

[root@crushlinux local]# ln -s /usr/local/httpd/bin/*  /usr/local/bin/

 

注:在任意目录下。都可以使用httpd下的命令,为命令路径添加一条软连接。

*4.1 PHP_ARG_:
赋予用户可选项

 

*在以上的
config.m4 例子中,两条注释后,最先见到的 3 行代码,使用了
PHP_ARG_WITH() 和 PHP_ARG_ENABLE()。这些给 configure
提供了可选项,和在运行 ./configure –help
时显示的帮助文本。就象名称所暗示的,其两者的不同点在于是创建 –with-

选项还是 –enable-*
选项。每个扩展应提供至少一个以上的选项以及扩展名称,以便用户可选择是否将扩展构建至
PHP 中。按惯例,PHP_ARG_WITH()
用于取得参数的选项,例如扩展所需库或程序的位置;而 PHP_ARG_ENABLE()
用于代表简单标志的选项。

添加httpd为系统服务并重命名为httpd

不管你使用哪一个指令,你都应该注释掉另外一个。也就是说,如果你使用了–enable-my_module,那就应该去掉–with-my_module。反之亦然。
configue使用例子:./configure   –enable-hello_module
则将

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd(将服务控制工具复制到init.d下)
vi /etc/init.d/httpd  #编辑启动脚本,增加红色部分内容,以便通过chkconfig管理
    #!/bin/sh
    #chkconfig:345 66 88
    #description:Startup script for the Apache HTTP Server

 

解释:

dnl PHP_ARG_ENABLE(hello_module, whether to enablehello_module support,
dnl Make sure that the comment is aligned:
dnl [ --enable-hello_module      Enablehello_module support])
修改成
PHP_ARG_ENABLE(hello_module, whether to enablehello_module support,
dnl Make sure that the comment is aligned:
[ --enable-hello_module      Enablehello_module support])

    345 66
88表示:
345运行级别是开启的,66为服务启动顺序,88服务为停止顺序。

 
4.2
处理用户选择

 chmod +x /etc/init.d/httpd
        chkconfig --add httpd            //将httpd服务添加为系统服务
        chkconfig --list httpd
启动服务
    service httpd start

config.m4可给用户提供一些做什么的选择,现在就是做出选择的时候了。在上例中,三个选项在未指定时显然默认为
“no”。习惯上,最好用此值作为用于启用扩展的选项的默认值,为了扩展与 PHP
分开构建则用 phpize 覆盖此值,而要构建在 PHP
中时则不应被默认值将扩展空间弄乱。处理这三个选项的代码要复杂得多。

报错1:httpd: Could not reliably determine the server’s fully
qualified domain name, using ::1 for ServerName   

不能找到完全合格的域名

 –with-example[=FILE]
选项

    解决:vim /usr/local/httpd/conf/httpd.conf

首先检测是否设置了 –with-example[=FILE]
选项。如此选项未被指定,或使用否定的格式(–without-example ),或赋值为
“no”
时,它会控制整个扩展的含有物其他任何事情都不会发生。在上面的例子中所指定的值为
/some/library/path/example-config,所以第一个 test 成功了。

        97 #ServerName www.example.com:80

接下来,代码调用 AC_MSG_CHECKING(),这是一个 autoconf
宏,输出一行标准的如 “checking for …” 的信息,并检测用户假定的
example-config 是否是一个明确的路径。在这个例子中,PHP_EXAMPLE
所取到的值为 /some/library/path/example-config,现已复制到 EXAMPLE_PATH
变量中了。只有用户指定了 –with-example ,才会执行代码 $php_shtool path
$EXAMPLE_CONFIG,尝试使用用户当前的 PATH 环境变量推测 example-config
的位置。无论如何,下一步都是检测所选的EXAMPLE_PATH
是否是正常文件,是否可执行,及是否执行成功。如成功,则调用
AC_MSG_RESULT(),结束由 AC_MSG_CHECKING() 开始的输出行。否则,调用
AC_MSG_ERROR(),打印所给的信息并立即中断执行 configure。

        98 ServerName localhost:80

代码现在执行几次 example-config
以确定一些站点特定的配置信息。下一步调用的是 PHP_CHECK_LIBRARY(),这是
PHP 构建系统提供的一个宏,包装了 autoconf 的 AC_CHECK_LIB()
函数。PHP_CHECK_LIBRARY()
尝试编译、链接和执行程序,在第一个参数指定的库中调用由第二个参数指定的符号,使用第五个参数给出的字符串作为额外的链接选项。如果尝试成功了,则运行第三个参数所给出的脚本。此脚本从
example-config
所提供的原始的选项字符串中取出头文件路径、库文件路径和库名称,告诉 PHP
构建系统。如果尝试失败,脚本则运行第四个参数中的脚本。此时调用
AC_MSG_ERROR() 来中断程序执行。

   报错2:

 –enable-example-debug 选项
处理 –enable-example-debug
很简单。只简单地检测其真实值。如果检测成功,则调用 AC_DEFINE() 使 C
语言宏指令 USE_EXAMPLE_DEBUG 可用于扩展的源代码。第三个参数是给
config.h 的注释字符串,通常可放心的留空。

/usr/local/apache/bin/httpd: error while loading shared libraries:
libiconv.so.2: cannot open shared object file: No such file or
directory

 –with-example-extra=DIR 选项
 对于此例子来说,由 –with-example-extra=DIR
选项所请求的假定的“额外”功能操作不会与假定的 example-config
程序共享,也没有默认的搜索路径。因此,用户需要在所需的库之前提供设置程序。有点不象现实中的扩展,在这里的设置仅仅起说明性的作用。

有很多so模块在/usr/local/lib目录下,所以在/etc/ld.so.conf中加入/usr/local/lib这一行

代码开始用已熟知的方式来检测 PHP_EXAMPLE_EXTRA
的真实值。如果所提供的为否定形式,则不会进行其他处理,用户也不会请求额外的功能。如果所提供的为未提供参数的肯定形式,则调用
AC_MSG_ERROR()
中止处理。下一步则再次调用PHP_CHECK_LIBRARY()。这一次,因为没有提供预定义编译选项,PHP_ADD_INCLUDE()
和 PHP_ADD_LIBRARY_WITH_PATH()
用于构建额外功能所需的头文件路径、库文件路径和库标志。也调用
AC_DEFINE()
来指示所请求的额外功能代码是可用的,设置变量来告诉以后的代码,有额外的源代码要构建。如果检测失败,则调用所熟悉的
AC_MSG_ERROR()。另一种不同的处理失败的方式是更换为调用
AC_MSG_WARNING(),例如:

[root@crushlinux conf]# vi /etc/ld.so.conf
/usr/local/lib
[root@crushlinux conf]# /sbin/ldconfig -v

 

现在您已经将 Apach源代码安装在 /usr/local/apache。本源代码安装支持可装载模块

4.3
PHP_NEW_EXTENSION宏

和标准的 MPM
prefork。之后,可以使用如下命令启动 Apache
服务器:

 默认情况下,通过ext_skel创建的config.m4都能接受指令,并且会自动启用该扩展。启用该扩展是通过PHP_EXTENSION这个宏进行的。如果你要改变一下默认的情况,想让用户明确的使用
–enable-my_module或
–with-my_module指令来把扩展包含在PHP二进制文件当中,那么将 “if test
“$PHP_MY_MODULE” != “no””改为“if test “$PHP_MY_MODULE” ==
“yes””即可。

/usr/local/httpd/bin/apachectl start

 

二.安装MySQL

if test "$PHP_MY_MODULE" == "yes"; thendnl
      PHP_EXTENSION(hello_module, $ext_shared)
fi 

1.准备工作

 
这样就会导致在每次重新配置和编译PHP时都要求用户使用
–enable-my_module指令。  

(1)查看是否使用以rpm包安装的mysql-server-mysql软件,如果有,将其卸载。

PHP_NEW_EXTENSION()
就是宏告诉构建系统去构建扩展本身和被其用到的文件。

[root@crushlinux ~]# rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
rpm -ivh /mnt/Packages/ncurses-devel-5.7-3.20090208.el6.x86_64.rpm

PHP_NEW_EXTENSION()参数:

(2)mysql5.5以上的版本都需要cmake编译。而不是./configure

第一个参数是扩展的名称,和包含它的目录同名。 
第二个参数是做为扩展的一部分的所有源文件的列表,参见 PHP_ADD_BUILD_DIR() 以获取将在子目录中源文件添加到构建过程的相关信息。 
第三个参数总是 $ext_shared, 当为了 --with-example[=FILE] 而调用 PHP_ARG_WITH()时,由 configure 决定参数的值。 
第四个参数指定一个“SAPI 类”,仅用于专门需要 CGI 或 CLI SAPI 的扩展。其他情况下应留空。 
第五个参数指定了构建时要加入 CFLAGS 的标志列表。
第六个参数是一个布尔值,为 "yes" 时会强迫整个扩展使用 $CXX 代替 $CC 来构建。
第三个以后的所有参数都是可选的。最后,调用 PHP_SUBST() 来启用扩展的共享构建。

所以需要安装cmake

例如我们要构建扩展是hello_module

tar xf  cmake-2.8.6.tar.gz
cd cmake-2.8.6
./configure
gmake && gmake install
或这是
yum -y install cmake
dnl $Id$  
dnl config.m4 for extension hello  
PHP_ARG_ENABLE(hello, whether to enable hello support,  
[  --enable-hello           Enable hello support])  
if test "$PHP_HELLO" != "no"; then  
PHP_NEW_EXTENSION(hello_module, hello_module.c, $ext_shared)  
fi  

2.源码编译及安装。

5、具体生成扩展

(1)

第一步,生成代码
PHP为了扩展开发的方便,提供了一个类似代码生成器的工具ext_skel,具体可以参见说明。
首先我们创建一个文件helloworld.skel,

[root@crushlinux ~]#groupadd mysql
[root@crushlinux ~]# useradd -M -s /sbin/nologin  mysql -g mysql
它的内容为
string getstring(string str)

执行:
./ext_skel --extname=helloworld--proto=helloworld.skel

1、.svnignore 当在SVN协作模式下开发时,默认使文件不被SVN识别。
2、EXPERIMENTAL 该文件用来标识并记录稳定版发布前的开发日志、敬告、提示等相关的信息。当正式发行时应该删除它。
3、config.w32 在Windows环境下用到的配置文件,通常是需要修改的。
4、config.m4 在linux/Unix环境下用到的配置文件,通常也是需要修改的。
5、phpext.c 默认包含基本的扩展示例源码,即,默认情况下,扩展的代码写到这里面。
6、php_phpext.h 扩展的源文件所包含的头文件,里面包含对函数的定义。
7、CREDITS 第一行写扩展的名字,第二行写参与者的名字,多个用逗号隔开。
8、phpext.php 一个用来较验扩展是否正常加载、工作的PHP文件,根据实际情况修改。
9、tests 文件夹内将默认存储与扩展Test相关的数据或文件。

(2)解包

这时候,helloworld这个扩展的代码框架就已经出来了

tar  xf mysql-5.5.22.tar.gz -C  /usr/src/
cd  /usr/src/mysql-5.5.22/

 

(3)配置

第二步,修改配置

cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql   -DSYSCONFDIR=/etc
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all

然后修改config.m4文件将10、11、12三行最前面的dnl删除掉,就是将

-DCMAKE_INSTALL-PREFIX=/usr/local/mysql  
:指定安装目录

dnl PHP_ARG_WITH(helloworld, for helloworldsupport,
dnl Make sure that the comment is aligned:
dnl [  --with-helloworld     Include helloworld support])

修改为

PHP_ARG_WITH(helloworld, for helloworld  support,
Make sure that the comment is aligned:
[  --with-helloworld     Include helloworld   support])

-DSYSCONFDIR=/etc                                                      
:指定初始化参数文件目录

第三步,实现功能
修改源码helloworld.c文件,找到将getstring这个函数修改为

-DDEFAULT_CHARSET=utf8
                               :指定默认的字符编码集,如utf8

PHP_FUNCTION(getstring)
{
    char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    char *result;

    if (zend_parse_parameters(argc TSRMLS_CC, "s", &str, &str_len) == FAILURE)
        return;

    str_len = spprintf(&result, 0, "%s", str);
    RETURN_STRINGL(result, str_len, 0);
}

-DDEFAULT_COLLATION=utf8_general_ci     
:指定默认使用的字符集校对规则。Utf8_general_ci是适用于utf-8字符集的通用规则

第四步,编译扩展

-DWITH_EXTRA_CHARSETS=all               
:指定额外支持的其他字符集编码(默认支持所有)

phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

如报以下错误:解决方法如下:

第五步,添加扩展
这时候,一切顺利的话,该扩展已经在modules/ccvita.so这个位置了。下面就是将这个扩展加入到PHP中去,让我们PHP程序可以调用到。

rpm -ivh /mnt/Packages/ncurses-devel-5.7-3.20090208.el6.x86_64.rpm
[root@crushlinux mysql-5.5.22]#  rm  CMakeCache.txt
vim /usr/local/php/etc/php.ini
extension=helloworld.so #在php.ini文件最后增加这一行
service php-fpm restart #重启PHP服务

4)安装

 看一下鸟哥的一张图片

make && make install

澳门新浦京电子游戏 2
 

5).安装后的其他调整

chown -R  mysql:mysql /usr/local/mysql/

6)建立配置文件

[root@crushlinux mysql]#rm -fr /etc/my.cnf
[root@crushlinux mysql]#cp  support-files/my-medium.cnf  /etc/my.cnf

7)初始化数据库

/usr/local/mysql/scripts/mysql_install_db --user=mysql  --basedir=/usr/local/mysql  
--datadir=/usr/local/mysql/data/

8)设置环境变量

[root@crushlinux mysql]# ln -s  /usr/local/mysql/bin/*  /usr/local/bin/

9)添加系统服务

[root@crushlinux mysql]# cp support-files/mysql.server  /etc/init.d/mysqld
[root@crushlinux mysql]# chmod +x /etc/init.d/mysqld

启动服务

[root@crushlinux mysql]# service mysqld start
Starting MySQL..                                           [  OK  ]

5.登录验证

[root@crushlinux mysql] mysql

三.安装PHP

1.源码包安装libmcript

[root@crushlinux ~]# tar zxf libmcrypt-2.5.8.tar.gz [root@crushlinux ~]# cd libmcrypt-2.5.8/
[root@crushlinux libmcrypt-2.5.8]# ./configure
[root@crushlinux libmcrypt-2.5.8]# make && make install
[root@crushlinuxlibmcrypt-2.5.8]#ln -s /usr/local/lib/libmcrypt.* /usr/lib/

2.源代码安装mhash

[root@crushlinux ~]# tar zxf mhash-0.9.9.9.tar.gz 
[root@crushlinux ~]# cd mhash-0.9.9.9/
[root@crushlinux mhash-0.9.9.9]# ./configure
[root@crushlinux mhash-0.9.9.9]# make && make install
[root@crushlinux mhash-0.9.9.9]# ln -s /usr/local/lib/libmhash* /usr/lib/

3、源代码安装mcrypt

[root@crushlinux ~]# tar zxf mcrypt-2.6.8.tar.gz
[root@crushlinux ~]# cd mcrypt-2.6.8/
[root@crushlinux mcrypt-2.6.8]# ./configure
[root@crushlinux mcrypt-2.6.8]# make && make install

编译时候报错:

configure: error: *** libmcrypt was not found

解决办法:

第一步:ln -s   

/usr/local/bin/libmcrypt_config   /usr/bin/libmcrypt_config

 

第二步:

export LD_LIBRARY_PATH=/usr/local/lib: LD_LIBRARY_PATH

 

4、编译php

[root@crushlinux ~]# tar zxf php-5.3.6.tar.gz 
[root@crushlinux ~]# cd /php-5.3.6
[root@crushlinux php-5.3.6]# ./configure --prefix=/usr/local/php5 --with-mcrypt --with-apxs2=/usr/local/httpd/bin/apxs --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring

编译参数解释:

–prefix=/usr/local/php5                  //指定安装目录

–with-mcrypt                             //加载扩展工具支持

–with-apxs2=/usr/local/httpd/bin/apxs
//设置Apache提供的apxs模块                         
                    
程序文件位置

–with-mysql=/usr/local/mysql              //指定mysql服务的安装路径

–with-config-file-path=/usr/local/php5
//指定php配置文件“php.ini”                        
                    
的存放路径

–enable-mbstring                      //启用多字节字符串功能

如报以上错误,解决方法如下

[root@crushlinux php-5.6.30]# rpm -ivh
/media/cdrom/Packages/libxml2-2.7.6-14.el6.x86_64.rpm

[root@crushlinux php-5.6.30]# rpm -ivh
/media/cdrom/Packages/zlib-devel-1.2.3-29.el6.x86_64.rpm

[root@crushlinux php-5.6.30]# rpm -ivh
/media/cdrom/Packages/libxml2-devel-2.7.6-14.el6.x86_64.rpm

5.安装

make &&  make install

四.整合lamp组件环境

php.ini配置文件

安装好PHP软件包以后,服务器并不会自动创建php.ini配置文件,在源码包目录下提供了两个样例配置文件。

[root@crushlinux php-5.3.6]# cd php-5.3.6
    [root@crushlinux php-5.3.6]# ls php.ini-*
/usr/src/php-5.3.6/php.ini-development //开发版样例文件,用户学习,测试
/usr/src/php-5.3.6/php.ini-production//生产版样例文件,用户实际运用

1)复制样例文件

[root@crushlinux php-5.3.6]# 
cp php.ini-development /usr/local/php5/php.ini

2)php.ini配置调整

[root@crushlinux php-5.3.6]# vi /usr/local/php5/php.ini
773 default_charset = "utf-8"        //设置默认字符集为utf-8
871 file_uploads = On                //允许通过PHP网页上传文件
880 upload_max_filesize = 2M        //允许上传的文件大小限制
883 max_file_uploads = 20            //每个HTTP请求最多允许上传的文件数
728 post_max_size = 8M                //每次通过表单POST提交的数据量限制
226 short_open_tag = On                //允许识别PHP短语法标记,即<? … ?>

3)调整Apache配置

[root@crushlinux ~]# vim /usr/local/httpd/conf/httpd.conf
53 LoadModule php5_module        modules/libphp5.so    
    配置加载PHP程序的模块文件php5_module模块名称
modules/libphp5.so    模块位置

54 AddType application/x-httpd-php .php .phtml                 
    添加对“.php”类型网页支持
169  DirectoryIndex index.php index.html        
    识别常见的php首页文件
[root@crushlinux ~]# /usr/local/httpd/bin/apachectl restart

五、测试

1)测试PHP能否正常提供服务

[root@crushlinux ~]# vim /usr/local/httpd/htdocs/test1.php
<?php
phpinfo();        内建函数用于显示PHP环境信息
?>
[root@crushlinux ~]# /usr/local/httpd/bin/apachectl restart

浏览器输入:

澳门新浦京电子游戏 3

有如上信息为正确

 

2)测试PHP能否正常访问mysql数据库

[root@crushlinux ~]# vi /usr/local/httpd/htdocs/test2.php

<?php
$link=mysql_connect('localhost','root','');  //连接的数据库
if($link) echo "OK!!";                    //    连接成功时的反馈
else echo "FAILD!!";                        //    失败时的反馈
?>

七.Lamp架构应用实例

部署phpMyAdmin系统

  • phpMyAdmin是一个使用PHP语言编写,用来管理MySQL数据库的Web应用系统。
  • 通过该套件的网页界面对MySQL数据库进行管理和维护。 

实验环境依托于:

1.解包并复制到网站目录:

Eg:将phpMyAdmin套件部署到网站根目录下,以便通过地址

[root@crushlinux~]# tar zxf
phpMyAdmin-3.3.10-all-languages.tar.gz

[root@crushlinux~]# mv
phpMyAdmin-3.3.10-all-languages/
/usr/local/httpd/htdocs/phpMyAdmin

2.建立配置文件config.inc.php:

默认提供的样例配置文件为config.sample.inc,以此建立config.inc.php配置文件,查找并修改配置文件中的“blowfish_secret”行,并设置一个短语密钥(此密钥用于网页cookie认证,不需要用户记忆)

[root@crushlinux~]# cd /usr/local/httpd/htdocs/phpMyAdmin/
[root@crushlinuxphpMyAdmin]# cp config.sample.inc.phpconfig.inc.php

[root@crushlinuxphpMyAdmin]# vim config.inc.php
$cfg['blowfish_secret'] = '123.asd';

3.访问phpMyAdmin的Web管理界面:

在浏览器中访问

澳门新浦京电子游戏 4

授权配置操作:

澳门新浦京电子游戏 5

phpMyAdmin主页面:

澳门新浦京电子游戏 6

 

phpMyAdmin系统默认使用cookie认证方式,在首次访问时页面下方会提示“必须启用Cookies才能登录”,要求在客户机的浏览器启用cookies机制。【直接F5刷新就ok了】

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注