2012-1-30 18:24 Monday  

今天更新了一下smarty到3.0,结果发现项目中的__autoload()不能用了,原来是因为smarty改变了autoload的方式。

解决方法如下:

function autoload($className){
    if (file_exists(SITEROOT.'include/module/'.$className.'.class.php'))
    include SITEROOT.'include/module/'.$className.'.class.php';
    else
    die('类'.$className.'文件不存在');
}
spl_autoload_register("autoload");

用上面的方式还可以依顺序同时载入几个autoload方法哦

AMP环境是用yum安装,CentOS系统,telnet memcached正常。PHP的memcache模块及socket都正常

分析后发现系统SeLinux开启,httpd只能访问443,80端口。

找到原因后就好办了,关闭SElinux就可以了。

修改/etc/selinux/config

SELINUX=disabled

重启系统或执行:

setenforce 0

搞定,泡茶或继续干活。

==========

以下介绍一下SELinux相关的工具

/usr/bin/setenforce 修改SELinux的实时运行模式
setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式
如果要彻底禁用SELinux 需要在/etc/sysconfig/selinux中设置参数selinux=0 ,或者在/etc/grub.conf中添加这个参数
/usr/bin/setstatus -v
察看系统的状态
以下是运行输出,请参考
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Policy version: 18

以上转自http://www.82cs.com/201001/07/php_fsockopen_connect_memcached_permission-denied/

2012-1-30 18:23 Monday  
mysqlcheck -A -r -c -p
输入密码来修复就可以了
    -A    检查所有数据库中的所有表
    -c    检查表的错误
    -r    可以修复大部分问题的修复(如果不赶时间的话,可考虑-e参数代替)
    -o    优化表(如果表太大,写操作比较频繁的话,可能会花较长时间)
    -p    指定加密码
2012-1-30 18:22 Monday  

方法一,首先修改 httpd.conf 配置文件:
vi /etc/httpd/conf/httpd.conf
查找 Options Indexes FollowSymLinks,修改为 Options -Indexes。
 


 
方法二,在www 目录下的修改 .htaccess 配置文件:
加入 Options -Indexes

2012-1-30 18:22 Monday  
win 2000/xp系统,运行“CMD”,在命提示行下输入 ftp 回车,进入ftp命令提示行,用 open 命令连接ftp,以连接白白网的ftp为例:
ftp> open ftp.szele.net,
Connected to ftp.szele.net,
注:表示已连接上,后面还有一些欢迎之类的信息。
User (ftp.szele.net:(none)):
注:提示输入用户名
331 User name okay, need password.
Password:
注:提示用户名正确,请输入密码。
230 User logged in, proceed.
出现这个提示时表示你已经成功登陆。
输入格式命令修改密码。
ftp> quote site pswd 老密码 新密码
回车后提示:
230 Password changed okay.
密码已修改成功。
530 Cannot change password.
表示你不能修改密码。
2012-1-30 18:21 Monday  

Windows下的Memcache安装
1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached
2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装
3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
4.下载php_memcache.dll,请自己查找对应的php版本的文件
5. 在C:\winnt\php.ini 加入一行 ‘extension=php_memcache.dll’
6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!

memcached的基本设置

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

php_Memcache.dll PHP组件下载 http://www.php100.com/html/download/server/2010/0125/3858.html

Memcache Win32 1.2.1 下载 http://www.php100.com/html/download/server/2010/0125/3857.html 

Memcache环境测试
运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始领略Memcache的魅力把!
< ?php
$mem = new Memcache;
$mem->connect(”127.0.0.1″, 11211);
$mem->set(’key’, ‘This is a test!’, 0, 60);
$val = $mem->get(’key’);
echo $val;
?>

 

方法。

< ?php
//连接
$mem = new Memcache;
$mem->connect("192.168.0.200", 12000);
//具体端口可以通过phpinfo() 查看
//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br />";

//替换数据
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";

//保存数组
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";

//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";

//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";

//关闭连接
$mem->close();
?>

 

如果正常的话,浏览器将输出:
Get key1 value: This is first value
Get key1 value: This is replace value
Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
Get key1 value:
Get key2 value:

程序代码分析

初始化一个Memcache的对象:
$mem = new Memcache;

连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:
$mem->connect("192.168.0.200", 12000);

保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三 个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过 去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:
$mem->set(‘key1‘, ‘This is first value’, 0, 60);

从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:
$val = $mem->get(’key1′);
echo "Get key1 value: " . $val;

现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:
$mem->replace(‘key1′, ‘This is replace value’, 0, 60);
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val;

同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出
$arr = array(‘aaa’,‘bbb’,‘ccc’, ‘ddd’);
$mem->set(‘key2′, $arr, 0, 60);
$val2 = $mem->get(‘key2′);
print_r($val2);

现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果
$mem->delete(‘key1′);
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val . "<br>";

最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接
$mem->flush();
$val2 = $mem->get(‘key2′);
echo "Get key2 value: ";
print_r($val2);
echo "<br>";

2012-1-30 18:21 Monday  

一、源码包准备

服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-v1.4.4 。
下载:http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,

libevent的最新版本是libevent-1.4.13-stable。(如果你的系统已经安装了libevent,可以不用安装)
官网:http://www.monkey.org/~provos/libevent/
下载:http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz

准备Memcached的PHP扩展的源码安装包:
官网:http://pecl.php.net/get/memcache-2.2.5.tgz

Linux指令下载:

wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
wget http://pecl.php.net/get/memcache-2.2.5.tgz

二、安装与配置

1、先安装libevent

tar zxvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure –prefix=/usr
make
make install

2、测试libevent是否安装成功

ls -al /usr/lib | grep libevent
libevent-1.1a.so.1
libevent-1.1a.so.1.0.2
libevent-1.4.so.2
libevent-1.4.so.2.1.3
libevent.a
libevent_core-1.4.so.2
libevent_core-1.4.so.2.1.3
libevent_core.a
libevent_core.la
libevent_core.so
libevent_extra-1.4.so.2
libevent_extra-1.4.so.2.1.3
libevent_extra.a
libevent_extra.la
libevent_extra.so
libevent.la
libevent.so

版本不同,可能文件列表不同。

3、安装memcached,同时需要安装中指定libevent的安装位置

tar zxvf memcached-1.4.4.tar.gz
cd memcached-1.4.4
./configure –with-libevent=/usr
make && make install

安装完成后会把memcached 自动放到 /usr/local/bin/memcached

4、测试是否成功安装memcached

ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 201869 12-14 21:44 /usr/local/bin/memcached

5、安装Memcache的PHP扩展

①安装PHP的memcache扩展

tar vxzf memcache-2.2.5.tgz
cd memcache-2.2.5
/usr/local/webserver/php/bin/phpize
./configure –enable-memcache –with-php-config=/usr/local/webserver/php/bin/php-config –with-zlib-dir
make
make install

②上述安装完后会有类似这样的提示:

Installing shared extensions: /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/

③把php.ini中的extension_dir = “./”修改为

extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-2007xxxx/”

④添加一行来载入memcache扩展:extension=memcache.so

三、memcached的基本设置

1.启动Memcache的服务器端:

memcached -d -m 10 -u root -l 202.207.177.177 -p 11211 -c 256 -P /tmp/memcached.pid

参数说明:

-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址202.207.177.177,
-p是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

2.如果要结束Memcache进程,执行:

kill `cat /tmp/memcached.pid`

也可以启动多个守护进程,不过端口不能重复。

3.检查Memcached是否启动

netstat -ant
tcp        0      0 202.207.177.177:11211       0.0.0.0:*                   LIST

11211端口已经打开,说明Memcached已正常启动。

4.重启CentOS

reboot

四、Memcache环境测试

运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始你的Memcache的征途吧!

1
2
3
4
5
6
7
8
9
<?php
 
$mem= newMemcache;
$mem->connect("202.207.177.177", 11211);
$mem->set('key', 'This is a test!', 0, 60);
$val= $mem->get('key');
echo$val;
 
?>


五、参考资料

对Memcached有疑问的朋友可以参考下列文章:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Nginx 0.8.x + PHP 5.2.10(FastCGI)搭建胜过Apache十倍的Web服务器: http://blog.s135.com/nginx_php_v5/

转 http://blog.lixiphp.com/centos-linux-memcache-nginx-php-install/

 

 

 

------------------------------------------------------------------------------------

直接能通过YUM安装MEMCACHE

1、安装 EPEL Repo

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm


2、安装 Memcache
yum -y install memcached


安装过程中可能会出现如下问题:
--> Missing Dependency: perl(Net::SSLeay) >= 1.33 is needed by package perl-AnyEvent-5.240-1.el5.rf.noarch (rpmforge)
Error: Missing Dependency: perl(Net::SSLeay) >= 1.33 is needed by package perl-AnyEvent-5.240-1.el5.rf.noarch (rpmforge)
You could try using --skip-broken to work around the problem
You could try running: package-cleanup --problems
package-cleanup --dupes
rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package.

这个问题是因为CentOS的 yum没有memcached需要的最新的 perl-Net-SSLeay 和 perl-IO-Socket-SSL包.
解决办法也很简单,删除旧的包,安装新的包。

查看旧版本的包
rpm -qa | grep perl-Net-SSLeay
rpm -qa | grep perl-IO-Socket-SSL

移除并安装新包
rpm-e perl-Net-SSLeay-1.30-4.fc6
rpm -e perl-IO-Socket-SSL-1.01-1.fc6
wget
http://packages.sw.be/perl-Net-SSLeay/perl-Net-SSLeay-1.36-1.el5.rfx.i386.rpm
wget http://packages.sw.be/perl-Net-SSLeay/perl-Net-SSLeay-1.36-1.el5.rfx.x86_64.rpm
wget http://packages.sw.be/perl-IO-Socket-SSL/perl-IO-Socket-SSL-1.34-1.el5.rfx.noarch.rpm
rpm -i perl-Net-SSLeay-1.36-1.el5.rfx.x86_64.rpm
rpm -i perl-Net-SSLeay-1.36-1.el5.rfx.i386.rpm
rpm -i perl-IO-Socket-SSL-1.34-1.el5.rfx.noarch.rpm

然后再执行安装命令
yum -y install memcached

即可安装成功

3、设置为开机启动
chkconfig --level 2345 memcached on


4、启动和停止
/etc/init.d/memcached start|stop

 

 

客户端,直接将 php_memcache.so放到php的module中,然后在php.ini中载入即可

 

为安全起见,最好是修改一下memcache的端口,不要保留为默认的11211

可以用下面的方式改

memcached -d -m 10 -u root -l 202.207.177.177 -p 11211 -c 256 -P /tmp/memcached.pid

也可以

vi /etc/sysconfig/memcached 修改那里的端口即可
<?php
/**
 * PHP操作mssql数据库类,含分页类
 * Enter description here ...
 * @author aboc 9986584 2011-04-09
 *
 */
class DB_Handle{
var $ClassName = "DB_Handle";

var $Server;
var $UserName;
var $Password;
var $Database;

var $LinkID=0;
var $QueryResult="";
var $LastInsertID = "";

//* private ignore=>ignore the error and continue, halt=>report the error and halt, report=>report the error and continue
var $Halt_On_Error = "report";

var $Error = "";
var $ErrNo = 0;

var $total = 0;
var $page = 0;
var $page_num = 10;
var $page_size = 10;
var $page_name = 'page';

//* remark: This is the db_mysql_class's structure     * function: Set the server,username,password,database variable.
function DB_Handle($server="",$username="",$password="",$database=""){
    $this->Server = $server;
    $this->UserName = $username;
    $this->Password = $password;
    $this->Database = $database;    
}

    //* function: Connect database and select database    * success: retun 1    * failed: return 0
function connect(){
    $this->LinkID = @mssql_pconnect($this->Server,$this->UserName,$this->Password);
    if(!$this->LinkID){
    $this->halt("mssql_pconnect($this->Server,$this->UserName,$this->Password): Failed");
    return 0;
    }
    if(!@mssql_select_db($this->Database)){
    $this->halt("mssql_select_db($this->Database) Failed.");
    return 0;
    }
    return 1;
}
//* function: Check the database, if exist then select        * exist: return 1        * not exist: return 0
function selectDatabase(){
    if(@mssql_select_db($this->Database))
    return 1;
    else
    return 0;
}
//* function: Execute SQL instruction    * success: return SQL Result.    * failed: return 0;
function execQuery($sql=""){
    if($this->LinkID == 0){
    $this->halt("Execute SQL Failed: Hava not valid database connect.");
    return 0;
    }
    ob_start();
    $this->QueryResult = mssql_query($sql,$this->LinkID);
    $error = ob_get_contents();
    ob_end_clean();
    if($error){
    $this->halt("Execute SQL: mssql_query($sql,$this->LinkID) failed.");
    return 0;
    }
    $reg = "#insert into#";
    if(preg_match($reg,$sql)){
    $sql = "select @@IDENTITY as id";
    $res = mssql_query($sql,$this->LinkID);
    $this->LastInsertID = mssql_result($res,0,id);
    }
    return $this->QueryResult;
}
//* function: Get the query result's row number//* success: return the row fo the Result//* failed: return 0
function getTotalRowNum($result=""){
    if($result != "") $this->QueryResult = $result;
    $row = @mssql_num_rows($this->QueryResult);
    if($row >= 0) return $row;
    $this->halt("Get a row of result Failed: Result $result is invalid.");
    return 0;
}
//* function: Get the last insert record's id    //* success: return id        //* failed: return 0
function lastInsertID(){
    return $this->LastInsertID;
}
//* function: Get a field's value    * success: return value of the field        * failed: return 0
function getField($result="",$row=0,$field=0){
    if($result != "") $this->QueryResult = $result;
    $fieldvalue = @mssql_result($this->QueryResult,$row,$field);
    if($fieldvalue != "") return $fieldvalue;
    $this->halt("Get field: mssql_result($this->QueryResult,$row,$field) failed.");
    return 0;
   //Here should have error handle
}
//* function: Get next record    * success: return a array of the record's value            * failed: return 0
function nextRecord($result=""){
    if($result != "") $this->QueryResult = $result;
    $record = @mssql_fetch_array($this->QueryResult);
    if(is_array($record)){
        foreach ($record as $key=>$row)
        $record[$key] = trim($row);
        return $record;
    }
    //$this->halt("Get the next record Failed: the Result $result is invalid.");
    return 0;
}
//* function: Free the Query Result    * success return 1   * failed: return 0
function freeResult($result=""){
    if($result != "") $this->QueryResult = $result;
    return @mssql_free_result($this->QueryResult);
}
//* function: Set the Halt_On_Error's state     * success: return 1    * failed: return 0
function setHaltOnError($state="ignore"){
    if(!($state == "ignore" || $state == "report" || $state == "halt")){
    $this->halt("Set the Halt_On_Error Fail: There is no state value $state");
    return 0;       
    }
    $this->Halt_On_Error = $state;
    return 1;
}
//* function: Get the Halt_On_Error's state
function getHaltOnError(){
    return $this->Halt_On_Error;
}
//* function: Get the class's name
function toString(){
    return $this->ClassName;
}
//* function: Error handle
function halt($msg){
    $this->Error = @mysql_error($this->LinkID);
    $this->ErrNo = @mysql_errno($this->LinkID);
    if ($this->Halt_On_Error == "ignore") return;
    $this->makeMsg($msg);
    if ($this->Halt_On_Error == "halt") die("Session halted");
}

//* function: Make error information and print
function makeMsg($msg){
    printf("Database error: %s
\n", $msg);
    printf("MySQL Error: %s (%s)
\n",$this->ErrNo,$this->Error);
}
/**
 * 以下为分页类
 */

    private function getQuery(){
        $query = '';
        if( isset($_GET) && is_array($_GET)){
            foreach ($_GET as $key=>$value){
                if ($key == 'page')continue;
                $query .= !empty($query)?'&'.$key.'='.$value:$key.'='.$value;
            }
        }
        $query .= empty($query)?'':'&';
        return $this->getFilename().$query;
    }
    
    /**
     * 获取当前的url文件名并带上?
     */
    private function getFilename() {
        //$filename = str_replace($_SERVER['QUERY_STRING'],'',basename($_SERVER["REQUEST_URI"]));
        $filename = str_replace('?'.$_SERVER['QUERY_STRING'],'',basename($_SERVER["REQUEST_URI"])).'?';
        return $filename;
    }
    
    /**
     * 返回带分页名的连接字符
     */
    private function returnPageLink( $page ){
        return $this->getQuery().$this->page_name.'='.$page;
    }

    /**
     * 下一页链接
     */
    function nextPageLink(){
        if( $this->page != $this->page_num )
        return $this->returnPageLink($this->page+1);
        else
        return '#';
    }    

   function getListData($sql,$num=10){
       $this->execQuery($sql);
       $this->page_num = $this->getTotalRowNum();
       if (!$this->page_num || !$num )return array();
       $this->page_size = $num;
       $this->page = isset($_GET[$this->page_name])?intval($_GET[$this->page_name]):1;
       $pageTotal = ceil($this->page_num/$num);
       if ($this->page < 0)$this->page = 0;
       if ($this->page > $pageTotal) $this->page = $pageTotal;
       $list = array();
       if (mssql_data_seek($this->QueryResult, ($this->page-1)*$this->page_size)){
           for ($i=0;$i<$num;$i++){
               $list[] = $this->nextRecord();
           }           
       }
       return $list;
   }


    /**
     * 输出中文分页链接 上一页,下一页
     *
     * @return unknown
     */
    function pagelist( $total='总共',$dataname='条',$now='当前',$page='页',$first='第一页',$last='尾页',$prev='上一页',$next='下一页' ){
        $total='<span>'.$total.$this->page_size.$dataname.' '.$now.($this->page).'/'.($this->page_num).$page.'</span>';
        $startpage='<a href="'.$this->returnPageLink(1).'">'.$first.'</a>';
        $endpage='<a href="'.$this->returnPageLink($this->page_num).'">'.$last.'</a>';
        if($this->page == 1){
            $prepage='<span>'.$prev.'</span>';
        }else{
            $prepage='<a href="'.$this->returnPageLink($this->page-1).'">'.$prev.'</a>';
        }
        if($this->page==$this->page_num){
            $nextpage='<span>'.$next.'</span>';
        }else{
            $nextpage='<a href="'.$this->returnPageLink($this->page+1).'">'.$next.'</a>';
        }
        if($this->page_size == 0)return '';
        return $total.' '.$startpage.' '.$prepage.' '.$nextpage.' '.$endpage;
    }
    
    /**
     * 输出下拉框的列表
     *
     */
    function select() {
        $select = '<select name="pageselect" id="pageselect"  onchange="window.location=\''.$this->getQuery().$this->page_name.'=\'+pageselect.value">';
        $totalnum = $this->page_num;
        for($i=1;$i<=$totalnum;$i++) {
            if($this->page == $i){
                $str = ' selected="selected"';
            } else {
                $str = '';
            }
            $select .= '<option value="'.$i.'"'.$str.'>'.$i.'</option>';
        }
        $select .= '</select>';
        if($this->page_size == 0)$select = '';
        return $select;        
    }

    /**
     * 输入页数到多少页
     *
     */
    function gotoPage($buttonname='到'){
        $string = '<input type="text" size="3" name="dm_pagenum"><input type="button" value="'.$buttonname.'" onclick="window.location=\''.$this->getQuery().$this->page_name.'=\'+dm_pagenum.value"> ';
        if($this->page_size == 0)$string = '';
        return $string;
    }
    
    function pageListBaidu($first='首页',$pre_page='上一页',$next_page='下一页',$last='尾页' ,$shownum=6) {
        if($this->page_num == 1) return;
        $pagelink = '';
        if($this->page != 1) {
            $pagelink .= '[<a href="'.$this->returnPageLink(1).'">'.$first.'</a>]&nbsp;';
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page-1).'">'.$pre_page.'</a>]&nbsp;';
        }
        for ($i=$shownum;$i>=1;$i--) {
            $tmp_page = $this->page - $i;
            if( $tmp_page >= 1 ) {
                $pagelink .= '[<a href="'.$this->returnPageLink($tmp_page).'">'.$tmp_page.'</a>]&nbsp;';
            }
        }
        $pagelink .= '<span>'.$this->page.'</span>';
        for ($i=1;$i<=$shownum;$i++) {
            $tmp_page = $this->page + $i;
            if( $tmp_page <= $this->page_num ) {
                $pagelink .= '[<a href="'.$this->returnPageLink($tmp_page).'">'.$tmp_page.'</a>]&nbsp;';
            }
        }        
        
        if( $this->page != $this->page_num ){
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page+1).'">'.$next_page.'</a>]&nbsp;';
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page_num).'">'.$last.'</a>]';
        }
        if($this->num == 0)$pagelink = '';
        return $pagelink;   
    }


}

2012-1-30 18:20 Monday  
<link rel="icon" href="animated_favicon1.gif" type="image/gif" >

一,getimagesize不知道为什么在本地会很慢,注释掉就可以了

二,关于这个用网上说的方法吧

php环境兼容性问题--
内容编码错误
无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。
请联系网站的所有者以告知此问题。

以前也遇到过同样的问题,记得是PHP代码ob_start('ob_gzhandler')导致的,导致的原因有两种,

1. 服务器不支持这种压缩格式,可使用function_exists('ob_gzhandler')判断,解决方法 ob_start('ob_gzhandler')改为ob_start();
2. 使用ob_start('ob_gzhandler')时候前面已经有内容输出,检查前面内容以及require include调用文件的内容。若无法找到可以在调用其它文件前使用ob_start(),调用之后使用 ob_end_clean () 来清除输出的内容;

在 调用ob_start();前加入 ob_end_clean () 

   还有一点需要注意的是,PHP5.30版本,默认不再支持<?=$username;?>这样的语法,输出变量需使用& lt;?php echo $username;?>语法才可以。你可以通过将 php.ini 中的 short_open_tag 设置为 On,这样就可以兼容原来的语法。

在对ubuntu系统进行相关设置后,就可以进行各种环境的搭建,这里介绍apache+mysql+php环境的搭建:
1、安装Mysql
aptitude install mysql-server mysql-client  安装过程中,要输入MySQL的root用户密码,
New password for the MySQL "root" user: <-- yourrootsqlpassword
Repeat password for the MySQL "root" user: <-- yourrootsqlpassword
数据文件放在: /var/lib/mysql下
2、安装Apache
代码:aptitude install apache2
安装完后,在浏览器中访问 http://192.168.0.100 看到如下图所示的页面,就说话安装成功了:
Ubuntu系统中Apache的默认文档根目录为 /var/www,配置文件位于/etc/apache2/apache2.conf。其他的一些额外配置文件存放在/etc/apache2的子目录 里,如 /etc/apache2/mods-enabled (Apache模块配置文件),/etc/apache2/sites-enabled (虚拟主机配置文件),还有 /etc/apache2/conf.d
3、安装Php5
aptitude install php5 libapache2-mod-php5
安装完成后,重新启动apache2服务:
代码: /etc/init.d/apache2 restart
由于默认Web站点的根目录位于 /var/www,我们就在该根目录新建一名为 info.php 的php程序文件,并从浏览器里访问它,以测试PHP5是否成功安装。该测试php文件中使用 phpinfo() 函数获得服务器中安装的PHP软件包详情,比如PHP的版本、所支持的组件等等。
代码: vi /var/www/info.php
<?php  phpinfo();  ?>
文件编辑好后,保存退出,在浏览器里浏览该文件(文中使用http://192.168.0.100/info.php
4、为PHP5安装MySQL支持
为了让PHP支持MySQL,我们必须安装php5-mysql软件包。同时,还可以为php安装一些可选的支持模块,如mcrypt, memcache, gd, pear, imagick等等。使用下面的命令可以搜索一下php5相关的模块:
aptitude search php5
选择你想安装的模块,并安装它们,本文列出了一些常用的php5软件包并安装,执行下面的命令: 
aptitude install php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-json
安装完成后,重启apache2服务: /etc/init.d/apache2 restart
这时候,刷新浏览器或者重新打开 http://192.168.0.100/info.php 就可以看到刚刚安装的php功能了,注意看看mysql和mysqli相关的信息
这样就完成了搭建。。。

by Aboc  

如果没有aptitude 则可以用apt-get

mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面。下面我详细说说它的使用方法!对初学者很有用的哦!
1.检测Apache是否支持mod_rewrite
         通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设 置。如果没有开启“mod_rewrite”,则打开目录 您的apache安装目录“/apache/conf/” 下的 httpd.conf 文件,通过Ctrl+F查找到“LoadModule rewrite_module”,将前面的”#”号删除即可。如果没有查找到,则到“LoadModule” 区域,在最后一行加入“LoadModule rewrite_module modules/mod_rewrite.so”(必选独占一行),然后重启apache服务器即可。
        
2.让apache服务器支持.htaccess
     如何让自己的本地APACHE服务器支持”.htaccess”呢?其实只要简单修改一下apache的httpd.conf设置就可以让APACHE支 持.htaccess了。打开httpd.conf文件(在那里? APACHE目录的CONF目录里面),用文本编辑器打开后,查找
<Directory />
     Options FollowSymLinks
     AllowOverride None
</Directory>
改为
<Directory />
     Options FollowSymLinks
     AllowOverride All
</Directory>
就可以了。

# /etc/init.d/httpd start
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]

1.netstat -lnp|grep 80

tcp        0      0 192.168.180.68:61027        0.0.0.0:*                   LISTEN      6289/oproxyd       
tcp        0      0 :::80                       :::*                        LISTEN      846/httpd           
tcp        0      0 ::ffff:192.168.180.68:7001 :::*                        LISTEN      32015/java         

找到pid 846

#ps 846

查看
#kill -9 846

杀掉

#./apachectl start

启动成功

*****************************************************************************
处理办法:
# ps -aux | grep http
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
root     12079 0.0 0.0 61164   720 pts/1    S+   16:06   0:00 grep http
# ps -aux | grep apache
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
apache   10820 0.0 0.0   2044   600 ?        Ss   Jan01   0:04 bash
root     12081 0.0 0.0 61160   716 pts/1    S+   16:06   0:00 grep apache
# kill -9 10820
# /etc/init.d/httpd start
Starting httpd:                                            [ OK ]
# /etc/init.d/httpd restart
Stopping httpd:                                            [ OK ]
Starting httpd:                                            [ OK ]
**********************************************************

2012-1-30 18:17 Monday  

如果默认编码是gb2312的话,会出现乱码.经百度告知原来是http.conf强制使用了utf-8,我们只要把它改为关闭就可以了

  AddDefaultCharset UTF-8 改为 AddDefaultCharset OFF

另外:有另外一种方法,但是我感觉好像没有奏效:http://hi.baidu.com/qrpeng/blog/item/e76164085e2b9e9e0a7b82fd.html

以下是引用他的

修改http.conf中的AddDefaultCharset为AddDefaultCharset off,关闭apache默认编码,这样php的应用和tomcat下的应用都分别采用各自的编码,apache不会强行修改这些应用返回的 response的http头中的charset。如此一来就ok了。

 

json的install。

Google到一些文档都是下载后进行编译的,显得比较费事。还好有大牛写出了比较简单的方法,我转载一下

yum update "*php*"

pecl install json

cd /etc/php.d/

echo “extension=json.so” >> json.ini

service httpd restart

2012-1-30 18:16 Monday  
用yum安装Apache,Mysql,PHP. 
2.1安装Apache 
yum install httpd httpd-devel 
安装完成后,用/etc/init.d/httpd start 启动apache 
设为开机启动:chkconfig httpd on 
2.2 安装mysql 
2.2.1 yum install mysql mysql-server mysql-devel 
同样,完成后,用/etc/init.d/mysqld start 启动mysql 
2.2.2 设置mysql密码 

启动mysql控制台:  mysql

mysql>; USE mysql; 
mysql>; UPDATE user SET Password=PASSWORD('newpassword') WHERE user='root'; 
mysql>; FLUSH PRIVILEGES; 
2.2.3 允许远程登录 
mysql -u root -p 
Enter Password: <your new password> 
mysql>GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; 
完成后就能用mysql-front远程管理mysql了。 
2.2.4 设为开机启动 
chkconfig mysqld on 
3. 安装php 
yum install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml 
/etc/init.d/httpd start



/升级默认的php5.1到5.2

vi gedit /etc/yum.repos.d/utterramblings.repo
在打开的文件中加入以下内容:
[utterramblings]
name=Jason’s Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
保存
 yum update php

 

安装ZendOptimizer

1、下载文件:

http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz  (32位)

http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz  (64位)

2、解压

解压后把ZendOptimizer-3.3.9-linux-glibc23-x86_64/data/5_2_x_comp目录下的ZendOptimizer.so拷贝到某一个目录,比如/usr/local/Zend/lib/

Zend optimizer 3.3.9有一些新的改动,不需要安装了,直接在php.ini文件里面引用.so文件即可:

3、修改/etc/php.ini文件

找到:zend.ze1_compatibility_mode = Off

修改为:zend.ze1_compatibility_mode = On

在末尾加上以下文字:

[Zend Optimizer]
zend_optimizer.optimization_level=1
zend_extension="/usr/local/Zend/lib/ZendOptimizer.so"

4、重启httpd服务,通过php -v 可以看效果。

 

安装eaccelerator

直接yum install php-eaccelerator

如果找不到,线 yum search eaccelerator

 

 

虚拟主机安装时注意,如果出现多个域名都指向同一个目录的情况

NameVirtualHost 127.0.0.1:80    #这句一定要和 <VirtualHost 127.0.0.1:80>配合才可以。
<VirtualHost 127.0.0.1:80>
DocumentRoot /var/www/html
ServerName t.dagongz.com
<Directory "/var/www/html">
allow from all
Options +Indexes
</Directory>
</VirtualHost>

<VirtualHost 127.0.0.1:80>
DocumentRoot /var/www/html/test/
ServerName test.dagongz.com
<Directory "/var/www/html/test/">
allow from all
Options +Indexes
</Directory>
</VirtualHost>

 

开启缓存Expires模块要有

ExpiresActive   on
ExpiresDefault   "access plus 86400 second"

 

卸载Mysql
 


[root@localhost ~]# rpm -qa|grep mysql
 
mod_auth_mysql-2.6.1-2.2
 
php-mysql-4.3.9-3.15
 
mysql-devel-4.1.20-1.RHEL4.1
 
mysql-4.1.20-1.RHEL4.1
 
mysqlclient10-3.23.58-4.RHEL4.1
 
libdbi-dbd-mysql-0.6.5-10.RHEL4.1
 
 
说明:rpm –qa | grep mysql 命令是为了把mysql相关的包都列出来,我上面的例子是Linux AS4默认安装mysql的rpm软件包列表,

如果是别的Linux版本列出来的列表有可能会不一样,不过不用担心,不管是什么,卸载都从最下面的一个包开始,直到卸载掉第一个为止。 
 
说明:rpm –e 是卸载rpm包的命令,后面是包名称,最后的版本号是不用打的,比如我们下一步卸载mysqlclient10-3.23.58-4.RHEL4.1包

方法如下:
 
rpm –e mysqlclient
 
 
卸载Apache

 
[root@localhost ~]# rpm -qa|grep httpd
 
httpd-manual-2.0.52-25.ent
 
system-config-httpd-1.3.1-1
 
httpd-2.0.52-25.ent
 
httpd-suexec-2.0.52-25.ent
 
 
说明:方法跟卸载Mysql一样,不用说了吧
 
 
卸载PHP

 
[root@localhost ~]# rpm -qa|grep php
 
php-odbc-4.3.9-3.15
 
php-4.3.9-3.15
 
php-mysql-4.3.9-3.15
 
php-pear-4.3.9-3.15
 
php-ldap-4.3.9-3.15
 
php-pgsql-4.3.9-3.15
 
 
说明:方法跟卸载Mysql一样
 
 
注意:卸载的时候如果卸载不掉,系统一般会提示包的依赖关系,并且列出依赖的包的名称,先卸载提示依赖的包就可以了。
 
 
如果实在实在有卸载不掉的包,可以加—nodeps这个参数来卸载,比如我们卸载php-4.3.9-3.15,实在卸不掉了。
 
 
就用:
 
[root@localhost ~]# rpm -e php-4.3.9-3.15 --nodeps