apache运行php5.2 5.3多个版本合集

有的时候一些程序比较挑php版本,一些稍微激进一点的程序都会对最新版本支持,如果嫌弃动手麻烦的话可以直接装个cpanel。

安装LAMP的环境配置大体流程如下

步骤一

首先必要条件安装好mysql和apache以及依赖环境包。

步骤二

安装php,5.2 5.3分开安装./configure的--prefix=路径分开指定成功编译完。

步骤三

前提说明mod_php模式有点戳上面安装php的时候记得fastcgi模式安装,如果是--with-apxs2参数安装的抱歉上去把参数调整好重新来过吧,到suphp官方下载编译安装好。

阅读剩余部分...

php安装memcache模块

安装memcahed后还需要给php安装上memcahe模块才能调用,如果你喜欢也可以用pecl install memcache安装,如果是从源码仓里面安装的php也可以直接搜索安装php-memcache
1
2
3
4
5
6
7
8
9
wget -c http://pecl.php.net/get/memcache-3.0.6.tgz
tar xzf memcache-3.0.6.tgz
cd memcache-3.0.6<div style="color:#e53333;">/usr/bin/phpize</div>
 
./configure --enable-memcache --with-php-config=<span style="color:#e53333;">/usr/bin/php-config</span> --with-zlib-dir
make
make install
echo "extension_dir = <span style="color:#e53333;">/usr/lib/php/extensions/no-debug-non-zts-20060613</span>" &gt;&gt;/etc/php.ini
echo "extension = memcache.so"&gt;&gt;/etc/php.ini<div style="color:#e53333;">/usr/bin/php -m|grep memcahe </div>
红色部分需要根据您的具体情况修改改,安装完后运行 

php 中ming的编译

1、下载  ming-0.4.0.rc1.tar.bz2  
wget http://mylinux.5d6d.com/userdirs ... ng-0.4.0.rc1.tar.gz
2、 tar jxvf ming-0.4.0.rc1.tar.bz2
3、cd ming-0.4.0.rc1 ; ./configure --prefix=/usr/local/ming ; make && make install
4、cp -r php_ext/*  /usr/local/src/php-5.2.8/ext/ming
5、cd /usr/local/php-5.2.8/
6、./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt=/usr/local/libmcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi --enable-fpm  --with-ming=/usr/local/ming
7、make && make install

php 编译(针对Apache)

PHP需要MySQL客户端模块支持,需要下载MySQL软件。
# cd /usr/local/src
# tar zvxf mysql-5.0.67-linux-i686-icc-glibc23.tar.gz
# mv mysql-5.0.67-linux-i686-icc-glibc23 /usr/local/mysql
# tar zvxf php-5.2.8.tar.gz
# cd php-5.2.8
# ./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-config-file-path=/usr/local/php/etc \
--with-mysql=/usr/local/mysql \
--with-libxml-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-iconv-dir \
--with-zlib-dir  \
--with-bz2 \
--with-openssl \
--with-mcrypt \
--enable-soap \
--enable-gd-native-ttf \
--enable-ftp \
--enable-mbstring \
--enable-sockets \
--enable-exif \
--disable-ipv6 \
--disable-cgi \
--disable-cli
# make
# make install
# mkdir /usr/local/php/etc
# cp php.ini-dist /usr/local/php/etc/php.ini

php 5.2.11 with php-5.2.11-fpm编译安装

安装libevent(版本不低于libevent-1.4.12)
wget http://syslab.comsenz.com/downlo ... .4.12-stable.tar.gz
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable
./configure --prefix=/usr/local/libevent
make && make install


安装php-fpm 0.6
wget http://syslab.comsenz.com/downlo ... m-0.6-5.2.11.tar.gz
tar -zxvf php-fpm-0.6-5.2.11.tar.gz
./php-fpm-0.6-5.2.11/generate-fpm-patch     //生成fpm补丁在/usr/local/src下


下载php-5.2.11.tar.gz
wget http://syslab.comsenz.com/downloads/linux/php-5.2.11.tar.gz
tar xvfz php-5.2.11.tar.gz
cd php-5.2.11
patch -p1 < ../fpm.patch
./buildconf --force
mkdir fpm-build && cd fpm-build
../configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-fpm  --with-fpm-bin=/usr/local/php/bin/php-fpm --with-fpm-conf=/usr/local/php/etc/php-fpm.conf --with-fpm-log=/usr/local/php/var/php-fpm.log --with-fpm-pid=/usr/local/php/var/php-fpm.pid  --with-fpm-user=www --with-fpm-group=www --with-libevent=/usr/local/libevent/ --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-mcrypt --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi  
make && make install

启动php-fpm
/etc/init.d/php-fpm start

默认端口9000启动,需要套接字启动,需要修改/usr/local/php/etc/php-fpm.conf

Eaccelerator 安装及配置

# cd /usr/local/src
# tar jxvf eaccelerator-0.9.5.2.tar.bz2
# cd eaccelerator-0.9.5.2
# /usr/local/php/bin/phpize
# ./configure \
    --enable-eaccelerator=shared \
    --with-php-config=/usr/local/php/bin/php-config \
    --with-eaccelerator-shared-memory \
    --with-eaccelerator-sessions \
    --with-eaccelerator-content-caching
# make
# make install
# mkdir /usr/local/php/ext
# ln -s /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so  /usr/local/php/ext/eaccelerator.so

tidy 安装 php扩展模块

来源: http://hi.baidu.com/leechl

首先要安装libtidy, 否则安装过程会报"configure: error: Cannot find libtidy"的错误.
libtidy的项目地址是:http://tidy.sourceforge.net/ , 我是在这里下载的http://anduin.linuxfromscratch.org/files/BLFS/sources/tidy-cvs_20070326.tar.bz2 或者  mylinux.5d6d.com/userdirs/c/f/mylinux/attachments/month_1102/tidy-cvs_20070326.tar.bz2

安装libtity

#tar jxf tidy-cvs_20070326.tar.bz2
#cd tidy-cvs_20070326
#./configure --prefix=/usr && make && make install

安装tidy的php扩展

#cd /home/php-5.2.8
#./configure --with-php-config=/home/php/bin/php-config && make && make install
#strip /home/php/lib/php/extensions/no-debug-non-zts-20060613/tidy.so
#vi /home/php/lib/php.ini
加入extension=tidy.so
#/home/php/sbin/php-fpm reload

安装好之后发现tidy.so没有load进去, 查了老半天看php_error.log, 发现有下面一行

PHP Startup: Unable to load dynamic library '/home/php/lib/php/extensions/no-debug-non-zts-20060613/tidy.so' - libtidy-0.99.so.0: cannot open shared object file: No such file or directory in Unknown on line 0

原来是找不到库文件, 虽然安装了库文件, 但是要用 /sbin/ldconfig 命令来重新加载. 于是执行如下命令.

# /sbin/ldconfig -f /etc/ld.so.conf
#/home/php/sbin/php-fpm restart

php-fpm.conf参数说明

emergency_restart_threshold 默认值 10

emergency_restart_interval  默认值 1m = 60s
表示在emergency_restart_interval(60)秒内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过emergency_restart_threshold个,php-fpm就会优雅重启。

request_terminate_timeout
请求处理超时时间,类似PHP中的max_execution_time

request_slowlog_timeout
超过这个时间的定义为slow请求。这些请求会进入slowlog日志

rlimit_files
文件句柄的最大限制

max_requests
在重启之前每个进程最多处理多少个请求。

libxlst 下载

简单介绍libxslt
libxslt 包括 libxslt 库文件. 它扩展了libxml2库,以支持 XSLT 文件.

软件包信息

下载地址 http://ftp.acc.umu.se/pub/GNOME/sources/libxslt/1.1/

php.ini 中开启短标签

控制参数: short_open_tag = On
如果设置为Off,则不能正常解析类似于这样形式的php文件:
<?
phpinfo()
?>

而只能解析
<?php
phpinfo()
?>
这样形式的php文件
所以要想php支持短标签,需要我们把short_open_tag  设置为On.

PHP 5.3新版特性浅析

注:本文转自51cto.com

从php4到php5,从个人框架到开源框架的发展,见证着php从山寨走上正规大军的发展。php6还在酝酿中,相信php5会作为php6小试牛刀的场地。php5.3是php5的一个里程碑,加入了大量新特性。

我个人总感觉php功能是越来越多了,但是php的语法却越来越丑陋了,有时加入了新功能,而新功能带来了问题,为了修复问题,又要加入新的语法来修复,郁闷。估计php用语法修复问题是为了更好的解析。

一、mysql驱动mysqlnd

一直以来,php都是通过mysql客户端连接mysql,而现在mysql官方已经推出php版的mysql客户端,而这个mysqlnd有效降低内存的使用以及提高性能。具体可以看:

http://dev.mysql.com/downloads/connector/php-mysqlnd/

http://forge.mysql.com/wiki/PHP_MYSQLND



从图中可以看出,使用mysqlnd少了从mysql驱动中复制数据到php扩展这一步。mysqlnd使用copy-on-write,也就是写时复制,读引用。

mysqlnd已经内置在php5.3的源码中,编译的时候使用--with-mysql=mysqlnd、--with-mysqli=mysqlnd 和 --with-pdo-mysql=mysqlnd 安装mysqlnd驱动。

mysqlnd的优点

编译php更方便了,不需要libmysql,已经内置在源码中

编译php更方便了,不需要libmysql,已经内置在源码中
使用php许可,避免版权问题
使用php的内存管理,支持php内存限制(memory_limit)
所有数据在内存只有一份,之前的libmysql有两份,参考上图
提供性能统计功能,帮助分析瓶颈
mysqli支持长连接(persistent connections)
性能绝对比libmysql要快
在驱动层增加缓存机制
看了这么多特点,有点矛盾,作为数据库抽象层的PDO能把不同后端的特点发挥出来吗?如果使用mysql作为数据库的话mysqli是不是更好的选择?我总觉得mysqli只是个过度产品,PDO才是未来的。

二、性能提高

md5()大概提高了10%-15%的性能
Better stack implementation in the engine,没明白
常量保存在ROM里(Constants moved to read-only memory),这里没明白意思
改进异常处理,操作码(opcode)更简洁
解决了include(require)_once重复打开的问题,之前once我都是用静态变量实现的,终于解决这个问题了
用gcc4编译的二进制文件将更小
整体性能提高了5%-15%
很多人觉得web的瓶颈在db,所以app应用的性能毫不在乎,我认为主要是因为app扩展比db扩展要容易得多,所以才会产生db瓶颈,但这并不意味着可以不顾虑app的性能,毕竟最终还是要在app里解决各种问题的,作为一名程序员编写高质量的代码是最基本的要求。程序的内存使用量少点和执行速度快点,在高并发下是有很效果的,有些时候你改动下实现方法,能提高几十倍也很正常,当然如果付出要很多收获很少的时候就不要太执着了,我觉得一定要有编写高质量代码的意识。

三、?:操作符

其实就是js里的||,返回的结果不是逻辑类型,而是返回本来变量的值,例如 false ?: 123返回123,而不是true。语法就是有点怪怪!

libpng 下载

http://downloads.sourceforge.net/libpng/libpng-1.2.29.tar.bz2

php-fpm.log 日志中的错误(摘自互联网)

几台使用了 nginx+php-fpm 的机器上,偶尔能看到php-fpm.log中有这样的内容


引用
Oct 28 23:13:53.849419 [NOTICE] fpm_got_signal(), line 73: received SIGCHLD
Oct 28 23:13:53.849490 [WARNING] fpm_children_bury(), line 229: child 15044 (pool default) exited on signal 11 SIGSEGV after 1.332818 seconds
Oct 28 23:13:53.850341 [NOTICE] fpm_children_make(), line 305: child 15122 (pool default) started

如果得到SIGSEGV信号的进程比较多的话,还能看到如下的日志


引用
Oct 28 09:03:15.812009 [WARNING] fpm_children_bury(), line 256: failed processes threshold (10 in 60 sec) is reached, initiating reload
Oct 28 09:03:15.812030 [NOTICE] fpm_pctl(), line 208: switching to 'reloading' state

然后php-fpm就会重启。其中的
failed processes threshold (10 in 60 sec) is reached
是在php-fpm.conf中设置的,表示在60秒内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过10个,php-fpm就会重启。可以通过把php-fpm.conf中的 emergency_restart_threshold的值设置的大一些来增加这个重启的阀值,比如增加到60个,在有些时候,这能够避免php-fpm重启,但这并不是解决问题的根本办法

SIGSEGV信号一般表示


引用
SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:
1.buffer overflow --- usually caused by a pointer reference out of range.
2.stack overflow --- please keep in mind that the default stack size is 8192K.
3.illegal file access --- file operations are forbidden on our judge system

其中的第三条,跟本问题的关系比较大。也就是php-cgi访问了一个不存在的或者没有权限访问的文件
我用的php-fpm补丁是0.5.8版的,按照一些说法,只要设置了


引用
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

之后,php-cgi如果找不到文件或者没有权限访问的话 会提示No input file specified. 或者Access denied.
问题到这里似乎又陷入了僵局
后来又在php.ini中找到了php-cgi的一个参数 cgi.fix_pathinfo


引用
cgi.fix_pathinfo  boolean
对 CGI 提供了真正的 PATH_INFO/PATH_TRANSLATED 支持。以前 PHP 的行为是将 PATH_TRANSLATED 设为 SCRIPT_FILENAME,而不管 PATH_INFO 是什么。有关 PATH_INFO 的更多信息见 cgi 规格。将此值设为 1 将使 PHP CGI 修正其路径以遵守规格。设为 0 将使 PHP 的行为和从前一样。默认为零。用户应该修正其脚本使用 SCRIPT_FILENAME 而不是 PATH_TRANSLATED。

把这个参数的值设置为1 ,cgi会多做一些检查,来判断请求的路径中,那部分是文件名,哪部分是路径名
下面是google groups上的一段话


引用
when cgi.fix_pathinfo was set to "1" it caused a lot of checks in order to find which part of SCRIPT_FILENAME is a file name and which is PATH_INFO. In case of missing file it caused NULL
in path_translated, which caused the crash.


资料引用:http://www.knowsky.com/536760.html

php-5.3.3 with php-fpm的编译安装

在php-fpm.org 网站上已经说明了。
PHP 5.3.3 is released and now bundles PHP-FPM。
告诉我们,在php-5.3.3版本中已经绑定了php-fpm 所以,再编译这个版本的时候不需要做打php-fpm补丁的操作了。
下面我就把如何编译并配置php-5.3.3 的步骤写出来,分享给大家。

1  wget http://syslab.comsenz.com/downloads/linux/php-5.3.3.tar.gz
2   tar zxvf php-5.3.3.tar.gz
3   cd php-5.3.3
4   './configure' '--prefix=/usr/local/php' '--with-config-file-path=/usr/local/php/etc' '--enable-fpm'  '--with-fpm-user=www' '--with-fpm-group=www' '--with-mysql=/usr/local/mysql' '--with-mysql-sock=/tmp' '--with-libxml-dir' '--with-gd' '--with-jpeg-dir' '--with-png-dir' '--with-freetype-dir' '--with-iconv-dir' '--with-zlib-dir' '--with-mcrypt' '--enable-soap' '--enable-gd-native-ttf' '--enable-ftp' '--enable-mbstring' '--enable-exif' '--enable-zend-multibyte' '--disable-ipv6' '--enable-fastcgi'  '--with-pear' '--with-curl' '--with-openssl'   

5   make && make install

注:如果在以上步骤中,提示找不到libevent 等错误时,那说明你还没有安装libevent这个库,所以需要手动安装一下。可以用yum install -y libevent 这个命令搞定。

如果你顺利执行完以上5步,那么你已经安装好了php-5.3.3

接下来就是需要配置了。
cp  /usr/local/src/php-5.3.3/php.ini-development  /usr/local/php/etc/php.ini
cp  /usr/local/php/etc/php-fpm.conf.default   /usr/local/php/etc/php-fpm.conf

vi  /usr/local/php/etc/php-fpm.conf
需要修改的地方为:
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

这些地方需要删除行开头的分号。

启动php-fpm  
命令为  /usr/local/php/sbin/php-fpm  -c /usr/local/php/etc/php.ini  -y /usr/local/php/etc/php-fpm.conf
你也可以使用系统启动脚本
cp /usr/local/src/php-5.3.3/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod 755 /etc/init.d/php-fpm
/etc/init.d/php-fpm start


注:php-5.3.3 并非稳定版本,不建议在生成环境中使用。另外从php-5.3版本起,mysql的驱动已经支持了mysqlnd,据说这个驱动有效减少了内存使用。具体请看 http://mylinux.5d6d.com/thread-408-1-1.html

libjpeg 下载

http://linux.softpedia.com/progDownload/libjpeg-Download-160.html