WelcomeYou :

感谢光临 DH`s BLOG 。欢迎常来踩!


预览模式: 普通 | 列表

centos 修改IP地址,网关,DNS

centos 修改IP地址,网关,DNS

    一、修改IP地址

修改对应网卡的IP地址的配置文件

[root@centos]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

    修改以下内容

DEVICE=eth0(描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth0)
BOOTPROTO=static(设置网卡获得ip地址的方式,可能的选项为static,dhcp或bootp,分别对应静态指定的ip地址,通过dhcp协议获得的ip地址,通过bootp协议获得的ip地址)
BROADCAST=192.168.0.255(对应的子网广播地址)
HWADDR=00:07:E9:05:E8:B4 (对应的网卡物理地址)
IPADDR=12.168.1.2(如果设置网卡获得ip地址的方式为静态指定,此字段就指定了网卡对应的ip地址)
IPV6INIT=no 
IPV6_AUTOCONF=no
NETMASK=255.255.255.0(网卡对应的网络掩码)
NETWORK=192.168.1.0(网卡对应的网络地址)
ONBOOT=yes(系统启动时是否设置此网络接口,设置为yes时,系统启动时激活此设备)

 

二、修改网关

   修改对应网卡的网关的配置文件

[root@centos]# vi /etc/sysconfig/network 

修改以下内容

NETWORKING=yes(表示系统是否使用网络,一般设置为yes。如果设为no,则不能使用网络,而且很多系统服务程序将无法启动)
HOSTNAME=centos(设置本机的主机名,这里设置的主机名要和/etc/hosts中设置的主机名对应)
GATEWAY=192.168.1.1(设置本机连接的网关的IP地址。例如,网关为10.0.0.2)

 

三、修改DNS

修改对应网卡的DNS的配置文件

 [root@centos]# vi /etc/resolv.conf

    修改以下内容

nameserver 202.101.224.68(域名服务器)
nameserver 202.101.224.69(域名服务器)

 

四、重新启动网络配置

[root@centos]# service network restart

[root@centos]# /etc/init.d/network restart


修改ip地址

即时生效:

[root@centos]# ifconfig eth0 192.168.0.2 netmask 255.255.255.0  

启动生效:

修改/etc/sysconfig/network-scripts/ifcfg-eth0


修改网关default gateway

即时生效:

[root@centos]# route add default gw 192.168.0.1 dev eth0

启动生效:

修改/etc/sysconfig/network


修改dns

修改/etc/resolv.conf

修改后可即时生效,启动同样有效


修改host name

即时生效:

[root@centos]# hostname centos1

启动生效:

修改/etc/sysconfig/network

标签: centos ip 网关 dns linux

php 二分法

CODE:

<?php   
//search函数 其中$array为数组,$k为要找的值,$low为查找范围的最小键值,$high为查找范围的最大键值   
function search($array$k$low=0$high=0)       
{    
    if(
count($array)!=and $high == 0)                 //判断是否为第一次调用   
    
{   
        
$high count($array);   
    }   
    if(
$low <= $high)                                //如果还存在剩余的数组元素   
    
{    
        
$mid intval(($low+$high)/2);                  //取$low和$high的中间值   
        
if ($array[$mid] == $k)                         //如果找到则返回   
        
{    
            return 
$mid;    
        }   
        elseif (
$k $array[$mid])                       //如果没有找到,则继续查找   
        
{    
            return 
search($array$k$low$mid-1);    
        }   
        else   
        {    
            return 
search($array$k$mid+1$high);    
        }    
    }    
    return -
1;    
}    
$array = array(4,5,7,8,9,10);                           //测试search函数   
echo search($array8);                             //调用search函数并输出查找结果   
?>   
标签: php

Michael Jackson

This is it!!!!

This is it 海淀剧院

attachments/200910/7072046695.jpg

实例(Smarty+FCKeditor新闻系统)

无意间在网上搜到的没觉得还好,为了方便就记这了 

实例(Smarty+FCKeditor新闻系统)
——一牛人学习php一个月的作业——


以下是主文件index.php的内容:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?php
require('./global.php');
require('./smarty/libs/Smarty.class.php');
require('./mysql.php');
require('./FCKeditor/fckeditor.php');
$action=$_REQUEST['action'];
//定义一个函数用于调用FCK
function editor($input_name, $input_value)
{
global $smarty;
$editor = new FCKeditor($input_name) ;
$editor->BasePath = "./FCKeditor/";//指定编辑器路径

$editor->ToolbarSet = "Default";//编辑器工具栏有Basic(基本工具),Default(所有工具)选择
$editor->Width = "100%";
$editor->Height = "320";
$editor->Value = $input_value;
$editor->Config['AutoDetectLanguage'] = true ;
$editor->Config['DefaultLanguage'] = 'en' ;//语言
$FCKeditor = $editor->CreateHtml();

$smarty->assign("editor", $FCKeditor);//指定区域
}

switch ($action){

case 'addnewsview':

$smarty= new Smarty();
$smarty->template_dir = './template';
$smarty->compile_dir = './smarty/templates_c';
$smarty->assign('page_title','新建新闻');
$smarty->assign('actionvalue','addnews');
editor('content','');//调用编辑器,并定义文本域名为content(与下面addnews中的$_REQUEST['content']对应
$smarty->display('addnews.htm');
break;

case 'addnews':
$title=$_REQUEST['title'];
$content=$_REQUEST['content'];
$db=new mysql();
$button=$_REQUEST['Submit'];

if(empty($title) || empty($content)){
echo "请填写完成!<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=./index.php?action=addnewsview\">";
}else{
$sql="insert into news values(id,'admin','$title','$content',NOW())";
$db->query_exec($sql);
echo "操作成功!<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=./index.php\">";
}
break;

case 'editnewsview':
$smarty= new Smarty();
$smarty->template_dir = './template';
$smarty->compile_dir = './smarty/templates_c';
$smarty->assign('page_title','修改新闻');
$smarty->assign('actionvalue','addnews');
$id=$_REQUEST['id'];

$query="select * from news where id=$id";
$db=new mysql();
$result = $db->query_exec($query);
$rs = $result-> fetch_assoc();

$smarty->assign('title',$rs['title']);
//$smarty->assign('content',$rs['content']);
$smarty->assign('actionvalue','editnews');
$smarty->assign('id',$rs['id']);
editor('content',$rs['content']);
$smarty->display('addnews.htm');
break;

case 'editnews':
$title=$_REQUEST['title'];
$content=$_REQUEST['content'];
$id=$_REQUEST['id'];

$button=$_REQUEST['Submit'];
$db=new mysql();
if ($button=='提交'){
$sql="update news set title='$title',content='$content',date=NOW() where id=$id";
$db->query_exec($sql);
echo "操作成功!<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=./index.php\">";
}
break;

case 'delnews':
$db=new mysql();
if ($checkbox!="" or count($checkbox)!=0) {
for ($i=0;$i<count($checkbox);$i++){
$db->query_exec("delete from news where id='$checkbox[$i]'");
}
}
echo "操作成功!<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=./index.php\">";
break;

default:
$smarty= new Smarty();
$smarty->template_dir = './template';
$smarty->compile_dir = './smarty/templates_c';
$smarty->assign('page_title','新闻管理');
$smarty->assign('actionvalue','delnews');

$query="select * from news";
$db=new mysql();
$result = $db->query_exec($query);

while ($rs = $result-> fetch_assoc()) {
$array[]= array("id"=>$rs['id'], "title"=>$rs['title'],"date"=>$rs['date']);
$smarty->assign('news',$array);
}

$smarty->display('index.htm');

}
?>

以下是模板文件index.htm的内容
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{$page_title}</title>

</head>

<body>
<p class="style1">新闻管理</p>
<hr>
<table width="771" height="115" border="0">
<tr>
<td height="62"><div align="center">系统管理</div></td>
<td width="666" rowspan="2"><form name="form1" method="post" action="">
<table width="543" border="0">
<tr>
<td width="253">标题</td>
<td width="230">日期</td>
<td width="46">选择</td>
</tr>
{section name=news loop=$news}
<tr>
<td><a href="./index.php?action=editnewsview&id={$news[news].id}">{$news[news].title}</a></td>
<td>{$news[news].date}</td>
<td><input name="checkbox[]" type="checkbox" id="checkbox[]" value="{$news[news].id}"></td>
</tr>
{/section}
</table>
<p>
<input type="submit" name="Submit" value="删除">
<input name="action" type="hidden" id="action" value="{$actionvalue}">
</p>
</form> </td>
</tr>
<tr>
<td width="95" height="47"><div align="center"><a href="./index.php?action=addnewsview">添加新闻</a></div></td>
</tr>
</table>
<p class="style1"> </p>
</body>
</html>

以下是添加新闻的模板文件addnews.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="./css/a.css" rel="stylesheet" type="text/css">
<title>{$page_title}</title>
</head>

<body>
<p class="style1">新闻管理登陆 </p>
<hr>
<table width="771" height="501" border="0">
<tr>
<td height="62"><div align="center">系统管理</div></td>
<td width="666" rowspan="2"><form name="form1" method="post" action="index.php">
<p>标题
<input name="title" type="text" id="title" value="{$title}">
</p>
<p>内容:</p>
<p>{$editor}</p>
<p>
<input type="submit" name="Submit" value="提交">
<input type="hidden" name='action' value={$actionvalue}>
<input name="id" type="hidden" value="{$id}">
</p>
</form>

</td>
</tr>
<tr>
<td width="95" height="433"><div align="center">添加新闻</div></td>
</tr>
</table>
</body>
</html>

注:数据库已经在附件里面,先新建一个名为new的数据库,再把表导入
本系统用户名:admin 密码:admin

下载文件程序打包.rar (1.01 MB , 下载:0次)

标签: php smarty fck

LAMP项目开发流程规则



LAMP项目三层架构体系是由表现层、应用层以及数据存储层构成的。


表现层主要由Web浏览器构成,用于表现应用层的数据或者通过应用层对数据进行操作。应用层主要由业务逻辑层和数据连接层构成,它们主要在应用服务器上运行。其中,业务逻辑层负责完成所有关键的业务操作,而数据连接层则负责与数据存储层进行通信。数据存储层则主要是指数据库,在这一层用来存储系统数据。




LAMP项目开发一般分为以下几个阶段,包括需求分析、系统设计、数据库设计、模块及界面设计、代码实现以及系统测试。
1.需求分析

在需求分析阶段,需要明确系统开发的主要目的,为开发人员界定具体的工作范围。明确系统将要实现的所有功能、角色划分、用户界面原型等,完成需求文档。需求分析阶段的文档包括需求阶段客户调查记录、需求访谈记录表、需求分析说明书、需求分析说明书、需求变更追踪表、需求总结报告等。

2.系统设计

系统设计阶段需要在需求分析的基础上进一步明确系统的总体框架,软件的组织结构、部署结构及运行环境。系统设计阶段包括开发计划、概要设计说明书。

3.数据库设计

根据系统的设计和功能模块的分析,数据库设计阶段包括进行数据进行数据库的需求分析,定义数据库表之间的关联和各个表的字段,以及通过数据库管理工具实现数据库的创建和维护。

4.模块及界面设计

该阶段是进一步详细设计的阶段。在该阶段需要定义各模块的功能,类之间的关联和类的属性、方法,建立用户界面原型,完成详细设计说明书等。

5.代码实现

按照设计文档进行编码,每完成一个模块应进行单元测试。进入编码工作之后,可能会发现前面分析或设计阶段的某些错误,这时应返回到前面的阶段进行必要的修改。

6.系统测试

测试的目的是在发布之前找出程序的错误。包括:核实每个模板是否正常运行(参考设计文档)、核实需求是否被正确实施(参考需求文档)。测试阶段的文档包括测试计划、问题报告单、问题报告单清单、测试报告等。
标签: 项目

mysql的字符串函数

对于针对字符串位置的操作,第一个位置被标记为1。
ASCII(str)
返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。
mysql> select ASCII('2');
-> 50
mysql> select ASCII(2);
-> 50
mysql> select ASCII('dx');
-> 100

也可参见ORD()函数。
ORD(str)
如果字符串str最左面字符是一个多字节字符,通过以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与ASCII()函数返回的相同值。
mysql> select ORD('2');
-> 50

CONV(N,from_base,to_base)
在不同的数字基之间变换数字。返回数字N的字符串数字,从from_base基变换为to_base基,如果任何参数是NULL,返回NULL。参数N解释为一个整数,但是可以指定为一个整数或一个字符串。最小基是2且最大的基是36。如果to_base是一个负数,N被认为是一个有符号数,否则,N被当作无符号数。 CONV以64位点精度工作。
mysql> select CONV("a",16,2);
-> '1010'
mysql> select CONV("6E",18,8);
-> '172'
mysql> select CONV(-17,10,-18);
-> '-H'
mysql> select CONV(10+"10"+'10'+0xa,10,10);
-> '40'

BIN(N)
返回二进制值N的一个字符串表示,在此N是一个长整数(BIGINT)数字,这等价于CONV(N,10,2)。如果N是NULL,返回NULL。
mysql> select BIN(12);
-> '1100'
OCT(N)
返回八进制值N的一个字符串的表示,在此N是一个长整型数字,这等价于CONV(N,10,8)。如果N是NULL,返回NULL。
mysql> select OCT(12);
-> '14'

HEX(N)
返回十六进制值N一个字符串的表示,在此N是一个长整型(BIGINT)数字,这等价于CONV(N,10,16)。如果N是NULL,返回NULL。
mysql> select HEX(255);
-> 'FF'

CHAR(N,...)
CHAR()将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。NULL值被跳过。
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'

CONCAT(str1,str2,...)
返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。
mysql> select CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
-> NULL
mysql> select CONCAT(14.3);
-> '14.3'
LENGTH(str)

OCTET_LENGTH(str)

CHAR_LENGTH(str)

CHARACTER_LENGTH(str)
返回字符串str的长度。
mysql> select LENGTH('text');
-> 4
mysql> select OCTET_LENGTH('text');
-> 4

注意,对于多字节字符,其CHAR_LENGTH()仅计算一次。
LOCATE(substr,str)

POSITION(substr IN str)
返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.
mysql> select LOCATE('bar', 'foobarbar');
-> 4
mysql> select LOCATE('xbar', 'foobar');
-> 0
该函数是多字节可靠的。
LOCATE(substr,str,pos)
返回子串substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在str里面,返回0。
mysql> select LOCATE('bar', 'foobarbar',5);
-> 7

这函数是多字节可靠的。
INSTR(str,substr)
返回子串substr在字符串str中的第一个出现的位置。这与有2个参数形式的LOCATE()相同,除了参数被颠倒。
mysql> select INSTR('foobarbar', 'bar');
-> 4
mysql> select INSTR('xbar', 'foobar');
-> 0

这函数是多字节可靠的。
LPAD(str,len,padstr)
返回字符串str,左面用字符串padstr填补直到str是len个字符长。
mysql> select LPAD('hi',4,'??');
-> '??hi'

RPAD(str,len,padstr)
返回字符串str,右面用字符串padstr填补直到str是len个字符长。
mysql> select RPAD('hi',5,'?');
-> 'hi???'
LEFT(str,len)
返回字符串str的最左面len个字符。
mysql> select LEFT('foobarbar', 5);
-> 'fooba'

该函数是多字节可靠的。
RIGHT(str,len)
返回字符串str的最右面len个字符。
mysql> select RIGHT('foobarbar', 4);
-> 'rbar'

该函数是多字节可靠的。
SUBSTRING(str,pos,len)

SUBSTRING(str FROM pos FOR len)

MID(str,pos,len)
从字符串str返回一个len个字符的子串,从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。
mysql> select SUBSTRING('Quadratically',5,6);
-> 'ratica'

该函数是多字节可靠的。
SUBSTRING(str,pos)

SUBSTRING(str FROM pos)
从字符串str的起始位置pos返回一个子串。
mysql> select SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> select SUBSTRING('foobarbar' FROM 4);
-> 'barbar'

该函数是多字节可靠的。
SUBSTRING_INDEX(str,delim,count)
返回从字符串str的第count个出现的分隔符delim之后的子串。如果count是正数,返回最后的分隔符到左边(从左边数) 的所有字符。如果count是负数,返回最后的分隔符到右边的所有字符(从右边数)。
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'

该函数对多字节是可靠的。
LTRIM(str)
返回删除了其前置空格字符的字符串str。
mysql> select LTRIM(' barbar');
-> 'barbar'
RTRIM(str)
返回删除了其拖后空格字符的字符串str。
mysql> select RTRIM('barbar ');
-> 'barbar'
该函数对多字节是可靠的。
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
返回字符串str,其所有remstr前缀或后缀被删除了。如果没有修饰符BOTH、LEADING或TRAILING给出,BOTH被假定。如果remstr没被指定,空格被删除。
mysql> select TRIM(' bar ');
-> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'

该函数对多字节是可靠的。
SOUNDEX(str)
返回str的一个同音字符串。听起来“大致相同”的2个字符串应该有相同的同音字符串。一个“标准”的同音字符串长是4个字符,但是SOUNDEX()函数返回一个任意长的字符串。你可以在结果上使用SUBSTRING()得到一个“标准”的 同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。
mysql> select SOUNDEX('Hello');
-> 'H400'
mysql> select SOUNDEX('Quadratically');
-> 'Q36324'

SPACE(N)
返回由N个空格字符组成的一个字符串。
mysql> select SPACE(6);
-> ' '

REPLACE(str,from_str,to_str)
返回字符串str,其字符串from_str的所有出现由字符串to_str代替。
mysql> select REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'

该函数对多字节是可靠的。
REPEAT(str,count)
返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL。
mysql> select REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'

REVERSE(str)
返回颠倒字符顺序的字符串str。
mysql> select REVERSE('abc');
-> 'cba'

该函数对多字节可靠的。
INSERT(str,pos,len,newstr)
返回字符串str,在位置pos起始的子串且len个字符长得子串由字符串newstr代替。
mysql> select INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'

该函数对多字节是可靠的。
ELT(N,str1,str2,str3,...)
如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数个数,返回NULL。ELT()是FIELD()反运算。
mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
FIELD(str,str1,str2,str3,...)
返回str在str1, str2, str3, ...清单的索引。如果str没找到,返回0。FIELD()是ELT()反运算。
mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 0
FIND_IN_SET(str,strlist)
如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被“,”分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为SET的列,FIND_IN_SET()函数被优化而使用位运算!如果str不是在strlist里面或如果strlist是空字符串,返回0。如果任何一个参数是NULL,返回NULL。如果第一个参数包含一个“,”,该函数将工作不正常。
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2

MAKE_SET(bits,str1,str2,...)
返回一个集合 (包含由“,”字符分隔的子串组成的一个字符串),由相应的位在bits集合中的的字符串组成。str1对应于位0,str2对应位1,等等。在str1, str2, ...中的NULL串不添加到结果中。
mysql> SELECT MAKE_SET(1,'a','b','c');
-> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
-> 'hello,world'
mysql> SELECT MAKE_SET(0,'a','b','c');
-> ''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
返回一个字符串,在这里对于在“bits”中设定每一位,你得到一个“on”字符串,并且对于每个复位(reset)的位,你得到一个“off”字符串。每个字符串用“separator”分隔(缺省“,”),并且只有“bits”的“number_of_bits” (缺省64)位被使用。
mysql> select EXPORT_SET(5,'Y','N',',',4)
-> Y,N,Y,N
LCASE(str)

LOWER(str)
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。
mysql> select LCASE('QUADRATICALLY');
-> 'quadratically'

UCASE(str)

UPPER(str)
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。
mysql> select UCASE('Hej');
-> 'HEJ'

该函数对多字节是可靠的。
LOAD_FILE(file_name)
读入文件并且作为一个字符串返回文件内容。文件必须在服务器上,你必须指定到文件的完整路径名,而且你必须有file权限。文件必须所有内容都是可读的并且小于max_allowed_packet。如果文件不存在或由于上面原因之一不能被读出,函数返回NULL。
mysql> UPDATE table_name
SET blob_column=LOAD_FILE("/tmp/picture")
WHERE id=1;


MySQL必要时自动变换数字为字符串,并且反过来也如此:
mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'

如果你想要明确地变换一个数字到一个字符串,把它作为参数传递到CONCAT()。

如果字符串函数提供一个二进制字符串作为参数,结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较。
标签: mysql

Linux下安装memcached和编译PHP扩展


1. 安装memcached (服务器版本1.2.6)

服务器OS是RHEL5(Red Hat Linux Enterprise 5),之前已经装好LAMP环境,这是我们的一台测试服务器,LAMP均位于/opt/lamp下。准备将memcached安装在/opt/cache/memcached目录下。

memcached需要libevent(http://monkey.org/~provos/libevent/)的支持,所以需要先安装libevent,安装目录位于/opt/cache/libevent,下载最新版本的libevent(此例中为1.4.8),解压后进入源代码目录,进行配置和安装。
./configure --prefix=/opt/cache/libevent

make

make install

接着安装memcached,使用的版本是1.2.6,进入解压后的源代码目录,
./configure --prefix=/opt/cache/memcached --with-libevent=/opt/cache/libevent

–with-libevent指令指定libevent的目录
make

make install

安装完成,试着使用
/opt/cache/memcached/bin/memcached -d -m 16 -p 33333 -u memcached -l 127.0.0.1

启动memcached服务器,但会报错,
error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

意思是memcached无法找到libevent-1.4.so.2这个文件,但明明是指定了libevent的安装目录,为什么找不到呢?

memcached其实是到/usr/lib/目录下去找libevent的so文件,但我在安装时指定的libevent是位于/opt/cache/libevent,所以解决办法是在/usr/lib目录下创建一个文件链接(不知道算不算一个bug)
ln -s /opt/cache/libevent/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2

再次启动memcached,一切正常。

2. 编译PHP的memcache扩展 (扩展版本2.2.4)
PHP的memcache是PECL下的一个包,下载地址位于http://pecl.php.net/package/memcache,因为这台服务器之前已经装好了PHP环境,所以我们直接将下载的tar包解压到PHP源代码目录下的ext目录中,进入memcache-2.2.4目录,使用phpize生成configure等配置文件
/opt/lamp/php/bin/phpize

配置
./configure --with-php-config=/opt/lamp/php/bin/php-config --enable-shared --enable-static

但此处会报错,提示找不到php_session.h头文件,该文件位于PHP源文件目录下的ext/session下,可以通过修改 configure文件,设置正确的session_inc_path变量,指向PHP源文件目录/opt/lamp/php-5.2.5即可,重新 configure即可通过。

接着调用make,会在module目录下生成memcache.so文件,将此文件拷贝到PHP的extension目录,再修改php.ini,重启httpd就完成了memcache扩展的配置。

值得注意的是,在编译扩展时,并不需要使用make install命令。