Archive for May, 2012

作者:AngryFox 分类: Uncategorized May 26th, 2012 暂无评论
<?php
$url=array();
$url[]='http://hk.xx.com';
$url[]='http://sz.xx.com';
$url[]='http://gz.xx.com';
$url[]='http://bj.xx.com';
$url[]='http://wh.xx.com';
$url[]='http://sh.xx.com';
//上面就是取一部分用来访问
$killapache='killall -9 httpd';//干掉apache
$kill_mongod = 'killall mongod';//干掉mongod
$start_xx1_mongod = 'mongod --config /etc/mongod_xx1.conf';//启动xx1 Mongod
$start_xx2_mongod = 'mongod --config /etc/mongod_xx2.conf';//启动xx2 Mongod

$restart_lnmpa = '/root/lnmpa restart';//重启lnmpa

$connect_status=0;//服务器链接状态
$mongo_status=0;//mongo状态
$server_500_status=0;//服务器500
$server_502_status=0;//服务器502
for($i = 0; $i < 6; $i ++)
{
	srand((double)microtime()*1000000);  //产生随机种子seed
	$k=rand(0,5);
	$go_url=$url[$k];
	$exec = "curl --connect-timeout 5 -i $go_url 2>/dev/null";
	$res = shell_exec($exec);
	if($res=="")
	{
		$connect_status++;//服务器无法连接次数+1
	}
	else if(stripos($res, 'EMongoException') !== false)
	{
		$mongo_status++;//mongod无法链接次数+1
	}
	else if(stripos($res, '500 Internal Server') !== false)
	{
		$server_500_status++;
	}
	else if(stripos($res, '502 Bad Gateway') !== false)
	{
		$server_502_status++;
	}
	else
	{
		//服务器正常
	}
	sleep(3);
}

///echo $connect_status."__".$mongo_status."__".$server_500_status."__".$server_502_status;exit;

//只要服务器无法正常工作,则重起相关服务
if($connect_status >=2 || $mongo_status>=2 || $server_500_status>=2 || $server_502_status>=2)
{
	shell_exec($killapache);
	shell_exec($killapache);//2次干掉apache

	shell_exec($kill_mongod);
	shell_exec($kill_mongod);
	shell_exec($kill_mongod);
	shell_exec($kill_mongod);//4次干掉mongod

	shell_exec($start_xx1_mongod);//启动xx1 Mongod
	shell_exec($start_xx2_mongod);//启动xx2 Mongod
	shell_exec($restart_lnmpa);//重启lnmpa
}

//发送邮件
if($connect_status>=2)
{
	sendmail(array('xx1@139.com','xx3@139.com'),'服务器无法链接','5次检测服务器,'.$connect_status.'次无法链接');exit;
}
else if($mongo_status>=2)
{
	sendmail(array('xx1@139.com','xx3@139.com'),'Mongod挂了','5次检测 Mongod,'.$mongo_status.'次挂掉');exit;
}
else if($server_500_status>=2)
{
	sendmail(array('xx1@139.com','xx3@139.com'),'500 Internal Server','5次检测服务器,'.$server_500_status.'次出现500 Internal Server');exit;
}
else if($server_502_status>=2)
{
	sendmail(array('xx@139.com','xx1@xx.com','xx2@139.com'),'502 Bad Gateway','5次检测服务器,'.$server_502_status.'次出现502 Bad Gateway');exit;
}
else {
	//服务器正常,生产时,请关闭这个邮件发送。。。
	sendmail(array('xx@xx.com'),'Good!!! 服务器正常','Good 服务器正常:'.$connect_status."__".$mongo_status."__".$server_500_status."__".$server_502_status);exit;
}

function sendmail($to,$subject = "",$body = "")
{
	error_reporting(E_STRICT);
    date_default_timezone_set("Asia/Shanghai");//设定时区东八区
   	require_once './PHPMailer_5.2.1/class.phpmailer.php';//这个Class不用解释把。google去找
   	require_once './PHPMailer_5.2.1/class.smtp.php';
	$mail= new PHPMailer(); //new一个PHPMailer对象出来
    $mail->CharSet ="UTF-8";//设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码
    $mail->IsSMTP(); // 设定使用SMTP服务
    $mail->SMTPDebug  = 1;                     // 启用SMTP调试功能
                                           // 1 = errors and messages
                                           // 2 = messages only
    $mail->SMTPAuth   = true;                  // 启用 SMTP 验证功能
    $mail->SMTPSecure = "ssl";                 // 安全协议
    $mail->Host       = "smtp.exmail.xx.com";      // SMTP 服务器
    $mail->Port       = 465;                   // SMTP服务器的端口号
    $mail->Username   = "xx@xxoo.com";  // SMTP服务器用户名
    $mail->Password   = "xxoo";            // SMTP服务器密码
    $mail->SetFrom('xx@xxoo.com', '监控');
    $mail->Subject    = $subject;
    $mail->MsgHTML($body);
    foreach ($to as $t)
    {
    	$mail->AddAddress($t);
    }
    if(!$mail->Send()) {
        return false;
    }
    else {
        return true;
    }
}
?>
作者:AngryFox 分类: Uncategorized May 12th, 2012 暂无评论
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,cp936,big5,latin1

set backspace=indent,eol,start
set wildmenu
set cin
set sw=4
set sta
syntax on
set nocompatible
set number
filetype off
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set ruler
set incsearch
set nobackup
filetype plugin indent on   " 开启插件
set backupcopy=yes          " 设置备份时的行为为覆盖
set ignorecase smartcase    " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set nowrapscan              " 禁止在搜索到文件两端时重新搜索
set hlsearch                " 搜索时高亮显示被找到的文本
set noerrorbells            " 关闭错误信息响铃
set novisualbell            " 关闭使用可视响铃代替呼叫set t_vb=                   " 置空错误铃声的终端代码

配置vim的方法是在用户主目录下建立个.vimrc文件,我一般使用root帐户,所以就在/root/下建立一个.vimrc文件:vi /root/.vimrc,以下是我的配置,直接复制粘贴进去即可。
==================================================
“语法高亮
syntax on
“显示行号
set nu

“修改默认注释颜色
hi Comment ctermfg=DarkCyan

“允许退格键删除
set backspace=2
“启用鼠标
set mouse=a
set selection=exclusive
set selectmode=mouse,key

“侦测文件类型
filetype on
“载入文件类型插件
filetype plugin on
“为特定文件类型载入相关缩进文件
filetype indent on

“设置编码自动识别, 中文引号显示
let &termencoding=&encoding
set fileencodings=utf-8,gbk,ucs-bom,cp936
set encoding=euc-cn
set ambiwidth=double

“设置高亮搜索
set hlsearch
“在搜索时,输入的词句的逐字符高亮
set incsearch

“按C语言格式缩进
set cindent
“设置Tab长度为4格
set tabstop=4
“设置自动缩进长度为4格
set shiftwidth=4
“继承前一行的缩进方式,特别适用于多行注释
set autoindent
“显示括号匹配
set showmatch
“括号匹配显示时间为1(单位是十分之一秒)
set matchtime=1

“增强模式中的命令行自动完成操作
set wildmenu
“不要生成swap文件,当buffer被丢弃的时候隐藏它
setlocal noswapfile
set bufhidden=hide
===========================================================

配置二:
然后关闭终端,重新开启终端,进入VIM 即可以看到效果
.vimrc
“”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"
” 一般设定
“”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"
” 设定默认解码
set fenc=utf-8
set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936

” 不要使用vi的键盘模式,而是vim自己的
set nocompatible

” history文件中需要记录的行数
set history=100

” 在处理未保存或只读文件的时候,弹出确认
set confirm

” 与windows共享剪贴板
set clipboard+=unnamed

” 侦测文件类型
filetype on

” 载入文件类型插件
filetype plugin on

” 为特定文件类型载入相关缩进文件
filetype indent on

” 保存全局变量
set viminfo+=!

” 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-

” 语法高亮
syntax on

” 高亮字符,让其不受100列限制
:highlight OverLength ctermbg=red ctermfg=white guibg=red guifg=white
:match OverLength ‘\%101v.*’

” 状态行颜色
highlight StatusLine guifg=SlateBlue guibg=Yellow
highlight StatusLineNC guifg=Gray guibg=White

“”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"
” 文件设置
“”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"
” 不要备份文件(根据自己需要取舍)
set nobackup

” 不要生成swap文件,当buffer被丢弃的时候隐藏它
setlocal noswapfile
set bufhidden=hide

” 字符间插入的像素行数目
set linespace=0

” 增强模式中的命令行自动完成操作
set wildmenu

” 在状态行上显示光标所在位置的行号和列号
set ruler
set rulerformat=%20(%2*%<%f%=\ %m%r\ %3l\ %c\ %p%%%)

" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2

" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2

" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l

” 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key

” 启动的时候不显示那个援助索马里儿童的提示
set shortmess=atI

” 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0

” 不让vim发出讨厌的滴滴声
set noerrorbells

” 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\

“”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"
” 搜索和匹配
“”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"”"
” 高亮显示匹配的括号
set showmatch

” 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=5

” 在搜索的时候忽略大小写
set ignorecase

” 不要高亮被搜索的句子(phrases)
set nohlsearch

” 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索)
set incsearch

” 输入:set list命令是应该显示些啥?
set listchars=tab:\|\ ,trail:.,extends:>,precedes:<,eol:$

" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3

" 不要闪烁
set novisualbell

" 我的状态行显示的内容(包括文件类型和解码)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}

" 总是显示状态行
set laststatus=2

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 文本格式和排版
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 自动格式化
set formatoptions=tcrqn

" 继承前一行的缩进方式,特别适用于多行注释
set autoindent

" 为C程序提供自动缩进
set smartindent

" 使用C样式的缩进
set cindent

" 制表符为4
set tabstop=4

" 统一缩进为4
set softtabstop=4
set shiftwidth=4

" 不要用空格代替制表符
set noexpandtab

" 不要换行
set nowrap

" 在行和段开始处使用制表符
set smarttab

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CTags的设定
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 按照名称排序
let Tlist_Sort_Type = "name"

" 在右侧显示窗口
let Tlist_Use_Right_Window = 1

" 压缩方式
let Tlist_Compart_Format = 1

" 如果只有一个buffer,kill窗口也kill掉buffer
let Tlist_Exist_OnlyWindow = 1

" 不要关闭其他文件的tags
let Tlist_File_Fold_Auto_Close = 0

" 不要显示折叠树
let Tlist_Enable_Fold_Column = 0

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Autocommands
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 只在下列文件类型被侦测到的时候显示行号,普通文本文件不显示

if has("autocmd")
autocmd FileType xml,html,c,cs,java,perl,shell,bash,cpp,python,vim,php,ruby set number
autocmd FileType xml,html vmap o‘>o–>
autocmd FileType java,c,cpp,cs vmap autocmd FileType html,text,php,vim,c,java,xml,bash,shell,perl,python setlocal textwidth=100
autocmd Filetype html,xml,xsl source $VIMRUNTIME/plugin/closetag.vim
autocmd BufReadPost *
\ if line("'\"") > 0 && line(“‘\”") <= line("$") |
\ exe "normal g`\"" |
\ endif
endif " has("autocmd")

" F5编译和运行C程序,F6编译和运行C++程序
" 请注意,下述代码在windows下使用会报错
" 需要去掉./这两个字符

" C的编译和运行
map :call CompileRunGcc()
func! CompileRunGcc()
exec “w”
exec “!gcc % -o %<"
exec "! ./%<"
endfunc

" C++的编译和运行
map :call CompileRunGpp()
func! CompileRunGpp()
exec “w”
exec “!g++ % -o %<"
exec "! ./%<"
endfunc

" 能够漂亮地显示.NFO文件
set encoding=utf-8
function! SetFileEncodings(encodings)
let b:myfileencodingsbak=&fileencodings
let &fileencodings=a:encodings
endfunction
function! RestoreFileEncodings()
let &fileencodings=b:myfileencodingsbak
unlet b:myfileencodingsbak
endfunction

au BufReadPre *.nfo call SetFileEncodings('cp437')|set ambiwidth=single
au BufReadPost *.nfo call RestoreFileEncodings()

" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile * setfiletype txt

" 用空格键来开关折叠
set foldenable
set foldmethod=manual
nnoremap @=((foldclosed(line(‘.’)) < 0) ? 'zc' : 'zo')

” minibufexpl插件的一般设置
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1
——————————————————————————–
.gvimrc
” Buffer的位置和大小
winpos 300 100
set lines=28
set columns=90

” 因为设定为不换行,所以要显示底部滚动条,不显示左右滚动条和工具栏
set guioptions+=b
set guioptions-=r
set guioptions-=l
set guioptions-=T

” 设定颜色方案和字体
” 英文用Consolas显示,中文用微软雅黑
colorscheme desert
set guifont=Consolas\ 11.5
set guifontset=Microsoft\ YaHei\ 11

” 用浅色高亮当前行
autocmd InsertLeave * se nocul
autocmd InsertEnter * se cul

作者:AngryFox 分类: Uncategorized May 11th, 2012 暂无评论

1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到
2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到
比 如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就 需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程 序运行时被找到。
3. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变 量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时 候使用。
4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。
5. 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事

符号链接错误 ldconfig: /usr/lib/libmysqlclient.so.16 is not a symbolic link
服务器升级过程中出现2个错误

ldconfig: /usr/lib/libmysqlclient.so.16 is not a symbolic link
ldconfig: /usr/lib/libmysqlclient_r.so.16 is not a symbolic link

提示两个so文件不是符号链接,这时再用ldconfig -v来查看两个文件链接的目标,分析之后重新链接
[root@server ~]# /sbin/ldconfig
/sbin/ldconfig: /usr/lib/libmysqlclient_r.so.16 is not a symbolic link

/sbin/ldconfig: /usr/lib/libmysqlclient.so.16 is not a symbolic link

ldconfig -v

注意位置就行。lnmp安装包下的执行如下操作即可。。

查看代码
打印
ln -sf /usr/local/mysql/lib/mysql/libmysqlclient_r.so.16 /usr/lib/libmysqlclient_r.so.16
ln -sf /usr/local/mysql/lib/mysql/libmysqlclient_so.16 /usr/lib/libmysqlclient.so.16

某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是centOS 5.5。首先做一个简单的so文件:

首先做一个简单的so文件:

/**
 * hello.c
 * To compile, use following commands:
 *   gcc -O -c -fPIC -o hello.o hello.c
 *   gcc -shared -o libhello.so hello.o
 */

int hello_add(int a, int b)
{
    return a + b;
}

然后将它编译成.so文件并放到系统中:

$ gcc -O -c -fPIC -o hello.o hello.c
$ gcc -shared -o libhello.so hello.o
$ su
# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
# cp libhello.so /usr/local/lib
# /sbin/ldconfig

写段小程序来验证其正确性:

/**
 * hellotest.c
 * To compile, use following commands:
 *   gcc -o hellotest -lhello hellotest.c
 */
#include <stdio.h>
int main()
{
    int a = 3, b = 4;
    printf("%d + %d = %d\n", a, b, hello_add(a,b));
    return 0;
}

编译并执行:

$ gcc -o hellotest -lhello hellotest.c
$ ./hellotest
3 + 4 = 7

OK,下面我们来制作PHP模块。首先确保你安装了 php-devel 包,没有的话请自行从安装光盘上找。然后下载php源代码。我使用的是php-5.2.3.tar.gz,解压缩。

$ tar xzvf php-5.2.3.tar.gz
$ cd php-5.2.3/ext

然后通过下面的命令建立一个名为 hello 的模块。

$ ./ext_skel --extname=hello

执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到php内部的编译方法。如果要编译成可动态加载的 php_hello.so,方法要更为简单。

$ cd hello 

首先编辑 config.m4 文件,去掉第16行和第18行的注释(注释符号为 dnl 。)

16:  PHP_ARG_ENABLE(hello, whether to enable hello support,
17:  dnl Make sure that the comment is aligned:
18:  [  --enable-hello           Enable hello support])

然后执行 phpize 程序,生成configure脚本:
$ phpize 该程序在ubuntu的php5-dev包中
然后打开 php_hello.h,在 PHP_FUNCTION(confirm_hello_compiled); 之下加入函数声明:

PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
PHP_FUNCTION(hello_add);

打开 hello.c,在 PHP_FE(confirm_hello_compiled, NULL) 下方加入以下内容。

zend_function_entry hello_functions[] = {
    PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
    PHP_FE(hello_add,   NULL)       /* For testing, remove later. */
    {NULL, NULL, NULL}  /* Must be the last line in hello_functions[] */
};

然后在 hello.c 的最末尾书写hello_add函数的内容:

PHP_FUNCTION(hello_add)
{
    long int a, b;
    long int result;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
        return;
    }

    result = hello_add(a, b);

    RETURN_LONG(result);
}

保存退出,编译并安装:
编译步骤,参照下一篇文章!
建立一个 hello.php 文件

然后在浏览器中打开hello.php文件,如果显示7,则说明函数调用成功了。
<?php
    echo hello_add(3, 4);
?>
作者:AngryFox 分类: Uncategorized May 11th, 2012 暂无评论

最重要的是配置文件路径对,然后就是调用编译的组件路径也对。

扩展模块编译的生成地方
/root/lnmp0.9/php-5.2.17/ext/my_ext/modules/my_ext.so
扩展编译后要放的地方
/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613
不要放在下面的地方
#/usr/local/php/include/php/ext/my_ext.so
修改配置文件添加扩展
/usr/local/php/etc/php.ini
PHP文件Cli地址
/usr/local/php/bin/php
这个地址已经要对,是PHP_FPM运行要检查的地方
extension_dir = '/usr/local/php/ext/'
extension=my_ext.so

详细的步骤见下面,如果出现问题,那一定是配置错误;

1.  $ cd ..
2.  $ vi ext/my_ext/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-my_ext
5.  $ make
6.  $ ./php -f ext/my_ext/my_ext.php
7.  $ vi ext/my_ext/my_ext.c
8.  $ make

错误:
PHP Warning: Module ‘eAccelerator’ already loaded in Unknown on line 0
是因为模块配置添加了两次以上,在配置文件中;
验证 php 是否正常
php -v php配置

一,搭建php环境
  下载php PHP 5.2.17p1源码 并解压
  编译安装,搭建php环境

  二,创建扩展项目
  进入源码目录
  cd php5.2.17/ext/
  ./ext_skel --extname=my_ext
  创建名字为my_ext的项目,最终会生成my_ext.so

  三,更改配置和程序
  $ vi ext/my_ext/config.m4
  根据你自己的选择将
  dnl PHP_ARG_WITH(my_ext, for my_ext support,
  dnl Make sure that the comment is aligned:
  dnl [ --with-my_ext Include my_ext support])
  修改成
  PHP_ARG_WITH(my_ext, for my_ext support,
  Make sure that the comment is aligned:
  [ --with-my_ext Include my_ext support])

  或者将
  dnl PHP_ARG_ENABLE(my_ext, whether to enable my_ext support,
  dnl Make sure that the comment is aligned:
  dnl [ --enable-my_ext Enable my_ext support])
  修改成
  PHP_ARG_ENABLE(my_ext, whether to enable my_ext support,
  Make sure that the comment is aligned:
  [ --enable-my_ext Enable my_ext support])

  $ vi ext/my_ext/php_my_ext.h
  将 PHP_FUNCTION(confirm_my_ext_compiled); /* For testing, remove later. */
  更改为
  PHP_FUNCTION(say_hello);

  $ vi ext/my_ext/my_ext.c
  将 zend_function_entry php5cpp_functions[] = {
  PHP_FE(confirm_my_ext_compiled, NULL) /* For testing, remove later. */
     {NULL, NULL, NULL} /* Must be the last line in php5cpp_functions[] */
  };
  更改为
  zend_function_entry php5cpp_functions[] = {
     PHP_FE(say_hello, NULL)
    {NULL, NULL, NULL} /* Must be the last line in php5cpp_functions[] */
  };

  在最后添加:
  PHP_FUNCTION(say_hello)
  {
    zend_printf("hello world\n");
  }

  四,编译
  $ cd my_ext
  $ /usr/local/php/bin/phpize
      ps: 如果出现:Cannot find autoconf.……的错误信息,则需要安装 autoconf (安装过程略)
  $ ./configure --with-php-config=/usr/local/php/bin/php-config
  $ make
  这时会编译出 my_ext/modules/my_ext.so

  五,配置php.ini
  将my_ext.so放入/usr/local/php/ext/目录
  $ vi php.ini
  修改添加如下:
  extension_dir = '/usr/local/php/ext/'
  extension=my_ext.so
  六,测试
  $ vi test.php
  <?php
     say_hello();
  ?>
  $ /usr/local/php/bin/php test.php
  hello world.