php编译安装

源码编译安装
官网
  • 官网:http://php.net/
  • 官网下载:http://php.net/downloads.php
了解与准备
Apache(httpd) nginx 与 php 连接方式:
httpd与php:
  • php 作为 httpd 模块
  • fastcgi(php-fpm)
  • cgi(此处不讲解)
nginx与php:
  • fastcgi(php-fpm)
PHP安装与依赖:
yum -y install gcc gcc-c++ libxml2 libxml2-devel bzip2 bzip2-devel libmcrypt libmcrypt-devel openssl openssl-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel readline readline-devel libxslt-devel perl perl-devel psmisc.x86_64 recode recode-devel libtidy libtidy-devel
  • 上面的依赖基本解决所需要的依赖。
  • 编译安装完成后可以增减所支持的php模块,此处所编译的模块已经非常完备。
  • 需要编译单个模块,查看php模块编译方式:php模块编译
  • 下面编译安装的配置选项:
    • –prefix=/usr/local/php7 主程序文件路径
    • –sysconfdir=/etc/php7 配置文件路径
    • –with-config-file-path=/etc/php7 php.ini 文件路径
    • –with-apxs2=/usr/local/httpd/bin/apxs 以 httpd 模块编译时需要指定 httpd 的 apxs 文件路径。
    • 其他的配置可以按自己需求指定,这几个选项也可以使用默认配置。
  • php7移除了 mysql 扩展,php7仅能是用 mysqli 和 pdo_mysql。php5可以使用。 php5编译时加入选项:–with-mysql 。详情查看下面的 PHP与MariaDB(mysql)连接
  • 此处以 CentOs7 编译 php7 为示例,配合讲解php5安装的要点。
  • php.ini 文件是在包目录下的 php.ini-development(开发), php.ini-production(生产)
    编译完成后选择自己需要的 php.ini 文件 复制到 –with-config-file-path 指定的目录。
    如果编译时为指定此选项,编译完成配置并启动nginx和php查看 phpinfo() 函数所指定的 php.ini 文件路径:Configuration File (php.ini) Path
    默认为php目录下的 lib 目录。
  • PHP安装与依赖中 psmisc.x86_64 是 killall 命令的包名,以便最小化安装时终止进程。
php编译与配置
httpd 模块
注意事项

需要事先存在httpd ,编译指定 apxs 文件位置。此处以–with-apxs2=/usr/local/httpd/bin/apxs 作为演示。

./configure –prefix=/usr/local/php5 –sysconfdir=/etc/php5 –with-config-file-path=/etc/php5 –with-apxs2=/usr/local/httpd/bin/apxs –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd –with-mhash –with-openssl –with-zlib –with-bz2 –with-curl –with-libxml-dir –with-gd –with-jpeg-dir –with-png-dir –with-zlib –enable-mbstring –with-mcrypt –enable-sockets –with-iconv-dir –with-xsl –enable-zip –with-pcre-dir –with-pear –enable-session  –enable-gd-native-ttf –enable-xml –with-freetype-dir –enable-gd-jis-conv –enable-inline-optimization –enable-shared –enable-bcmath –enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-mbregex –enable-pcntl –with-xmlrpc –with-gettext –enable-exif –with-readline –with-recode –with-tidy 

仅增加了选项--with-mysql=mysqlnd

./configure –prefix=/usr/local/php7 –sysconfdir=/etc/php7 –with-config-file-path=/etc/php7 –with-apxs2=/usr/local/httpd/bin/apxs –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd –with-mhash –with-openssl –with-zlib –with-bz2 –with-curl –with-libxml-dir –with-gd –with-jpeg-dir –with-png-dir –with-zlib –enable-mbstring –with-mcrypt –enable-sockets –with-iconv-dir –with-xsl –enable-zip –with-pcre-dir –with-pear –enable-session  –enable-gd-native-ttf –enable-xml –with-freetype-dir –enable-gd-jis-conv –enable-inline-optimization –enable-shared –enable-bcmath –enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-mbregex –enable-pcntl –with-xmlrpc –with-gettext –enable-exif –with-readline –with-recode –with-tidy  
fastcgi php-fpm 模式
./configure –prefix=/usr/local/php5 –sysconfdir=/etc/php5 –with-config-file-path=/etc/php5 –enable-fpm –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd –with-mhash –with-openssl –with-zlib –with-bz2 –with-curl –with-libxml-dir –with-gd –with-jpeg-dir –with-png-dir –with-zlib –enable-mbstring –with-mcrypt –enable-sockets –with-iconv-dir –with-xsl –enable-zip –with-pcre-dir –with-pear –enable-session  –enable-gd-native-ttf –enable-xml –with-freetype-dir –enable-gd-jis-conv –enable-inline-optimization –enable-shared –enable-bcmath –enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-mbregex –enable-pcntl –with-xmlrpc –with-gettext –enable-exif –with-readline –with-recode –with-tidy  

仅增加了选项 --with-mysql=mysqlnd

./configure –prefix=/usr/local/php7 –sysconfdir=/etc/php7 –with-config-file-path=/etc/php7 –enable-fpm –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd –with-mhash –with-openssl –with-zlib –with-bz2 –with-curl –with-libxml-dir –with-gd –with-jpeg-dir –with-png-dir –with-zlib –enable-mbstring –with-mcrypt –enable-sockets –with-iconv-dir –with-xsl –enable-zip –with-pcre-dir –with-pear –enable-session  –enable-gd-native-ttf –enable-xml –with-freetype-dir –enable-gd-jis-conv –enable-inline-optimization –enable-shared –enable-bcmath –enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-mbregex –enable-pcntl –with-xmlrpc –with-gettext –enable-exif –with-readline –with-recode –with-tidy 
整合httpd和fastcgi php-fpm模式
--with-apxs2(需要apxs程序)
yum -y install httpd-devel
./configure --prefix=/opt/laohulab/php5.6.31 --sysconfdir=/opt/laohulab/php5.6.31/etc  --with-config-file-path=/opt/laohulab/php5.6.31/etc --with-config-file-scan-dir=/opt/laohulab/php5.6.31/etc.d --with-apxs2 --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mhash --with-openssl --with-zlib --with-bz2 --with-curl --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-zlib --enable-mbstring --with-mcrypt --enable-sockets --with-iconv-dir --with-xsl --enable-zip --with-pcre-dir --with-pear --enable-session  --enable-gd-native-ttf --enable-xml --with-freetype-dir --enable-gd-jis-conv --enable-inline-optimization --enable-shared --enable-bcmath --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-mbregex --enable-pcntl --with-xmlrpc --with-gettext --enable-exif --with-readline --with-recode --with-tidy
php.ini 配置文件(在源码包目录下)
[root@nginx-10-20 php-5.6.31]# pwd
/root/php/php-5.6.31
[root@nginx-10-20 php-5.6.31]# cp php.ini-production /opt/laohulab/php5.6.31/etc/php.ini
php 作为 httpd 模块

不需要修改 php 配置

fastcgi php-fpm
cp /etc/php7/php-fpm.conf.default /etc/php7/php-fpm.conf  
cp /etc/php7/php-fpm.d/www.conf.default /etc/php7/php-fpm.d/www.conf
# 默认即可是本机 127.0.0.1 不必修改。
vim /etc/php7/php-fpm.d/www.conf
# 监听地址
listen = 127.0.0.1:9000
# 允许的客户端
listen.allowed_clients = 127.0.0.1
备注:php5 需要复制 php-fpm.conf.default 为 php-fpm.conf 即可。查看 php-fpm.conf 监听地址和允许的客户端。
启动与停止
httpd模块:  
重新加载 httpd 。

fastcgi:
vim /etc/php7/php-fpm.conf
打开注释:(不打开注释仅能使用 killall php-fpm 关闭 php)
pid = run/php-fpm.pid

启动:
/usr/local/php7/sbin/php-fpm

立刻终止
kill -INT `cat /usr/local/php7/var/run/php-fpm.pid`
kill -TERM `cat /usr/local/php7/var/run/php-fpm.pid`
killall php-fpm

平滑终止
kill -QUIT `cat /usr/local/php7/var/run/php-fpm.pid`

平滑重启
kill -USR2 `cat /usr/local/php7/var/run/php-fpm.pid`
加入环境变量
PHP=/opt/laohulab/php
export PATH=$PATH:$PHP/bin:$PHP/sbin
CentOS 系统服务(/etc/php7/php-fpm.conf 文件 pid = run/php-fpm.pid 注释需要打开:2.6 )
 
vi /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm

#! /bin/sh
# chkconfig: - 84 16
# description: PHP FastCGI Process Manager

# Source function library.
. /etc/init.d/functions

# Check that networking is up.
. /etc/sysconfig/network

# Additional environment file
if [ -f /etc/sysconfig/php-fpm ]; then
. /etc/sysconfig/php-fpm
fi

if [ $NETWORKING = “no” ]
then
exit 0
fi

RETVAL=0
prog=“php-fpm”
# 可根据版本不同修改 phpfpm pidfile lockfile变量。其他地方不用修改。
phpfpm=“/usr/local/php7/sbin/php-fpm”
pidfile=${PIDFILE-/usr/local/php7/var/run/php-fpm.pid}
lockfile=${LOCKFILE-/usr/local/php7/var/run/php-fpm.lock}

start () {
echo -n $“Starting $prog: “
dir=$(dirname ${pidfile})
[ -d $dir ] || mkdir $dir
daemon –pidfile ${pidfile} ${phpfpm}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop () {
echo -n $“Stopping $prog: “
killproc -p ${pidfile} php-fpm
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f ${lockfile} ${pidfile}
fi
}
restart () {
stop
start
}
reload () {
echo -n $“Reloading $prog: “
if ! ${phpfpm}test ; then
RETVAL=6
echo $“not reloading due to configuration syntax error”
failure $“not reloading $prog due to configuration syntax error”
else
killproc -p ${pidfile} php-fpm -USR2
RETVAL=$?
fi
echo
}
# See how we were called.
case $1 in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} php-fpm
RETVAL=$?
;;
restart)
restart
;;
reload|force-reload)
reload
;;
configtest)
${phpfpm}test
RETVAL=$?
;;
condrestart|try-restart)
[ -f ${lockfile} ] && restart || :
;;
*)
echo $“Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart|configtest}”
RETVAL=2
;;
esac
exit $RETVAL
service php-fpm {start|stop|status|restart|reload|force-reload|condrestart|try-restart|configtest}  
 
cp -p sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod 755 /etc/init.d/php-fpm

vim /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=php-fpm
After=syslog.target network.target

[Service]
Type=forking
PIDFile=/usr/local/php7/var/run/php-fpm.pid
ExecStart=/usr/local/php7/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl (start | restart | reload | stop | enable | disable | status) php-fpm.service
系统启动服务
 
chkconfig –add php-fpm
chkconfig –level 345 php-fpm on
chkconfig php-fpm off
chkconfig –list php-fpm
  
systemctl enable php-fpm.service
systemctl disable php-fpm.service
加入 man 文档
vim /etc/man.config 
MANPATH /usr/local/php7/php/man
vi /etc/man_db.conf  
MANPATH /usr/local/php7/php/man

然后就可以使用 man 命令查看

httpd nginx 与 php 连接
httpd 模块 php
要点:  
1:httpd开启模块:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

2:php编译指定 httpd apxs 路径(成为 httpd 模块)
--with-apxs2=/usr/local/httpd24/bin/apxs

连接:
~]# vi /etc/httpd/httpd.conf
1:添加:(编译时这个默认已经添加)
LoadModule php7_module modules/libphp7.so
#LoadModule php5_module modules/libphp5.so
2:添加 index.php:
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
3:文件最后添加:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
备注:vhost 也可以应用
httpd(fastcgi)与 php-fpm
要点:  
1:httpd开启模块:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

2:php编译开启模块:
--enable-fpm

连接方式1
~]# vi /etc/httpd/httpd.conf
最后添加:
# On:正向代理(默认) Off:反向代理(此处建议使用)
ProxyRequests Off
<FilesMatch \.php$>
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>

连接方式2
~]# vi /etc/httpd/httpd.conf
最后添加:
# On:正向代理(默认) Off:反向代理(此处建议使用)
ProxyRequests Off
<LocationMatch ^(.*\.php)$>
ProxyPass fcgi://127.0.0.1:9000/var/www/html/
</LocationMatch>

连接方式3:类型2的改变
~]# vi /etc/httpd/httpd.conf
最后添加:
# On:正向代理(默认) Off:反向代理(此处建议使用)
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1


连接方式设置完后再添加 index.php:
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>

备注:连接方式1 更方便在本地使用,23一般会使用远程 php 服务器上。
Nginx与php连接
要点:  
1:Nginx 默认支持 fastcgi
2:php编译开启模块:
--enable-fpm

连接:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
.......
# nginx 连接方式
location ~ \.php$ {
# root /:可以在这里单独设置php的根,$document_root 变量是上面 root 定义的网站根路径。
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

PHP与MariaDB(mysql)连接

4.1:使用 MariaDB 编译(相对于mysql安装的目录)  
--with-mysql=/usr/local/mysql
--with-mysqli=/usr/local/mysql/bin/mysql_config
--with-pdo-mysql=/usr/local/mysql

4.2:使用 PHP 的 mysqlnd 编译(推荐使用)
--with-mysql=mysqlnd
--with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd

4.3:php版本区别要点:
1:php7移除了 mysql 扩展,php7仅能是用 mysqli 和 pdo_mysql
2:mysqlnd 要求 php版本 >= 5.3
4:mysqlnd和php内部机制结合更紧密,是优化过的mysql驱动,建议使用
测试
1.1:添加文件与内容  
vim /var/www/html/index.php
<?php
phpinfo();
?>
php多版本安装注意事项
6.1:httpd与php  
httpd 模块:可以编译多个版本,但同时只能运行一个,另外一个需要注释。
LoadModule php7_module modules/libphp7.so
#LoadModule php5_module modules/libphp5.so

httpd fastcgi:
在 vhost 虚拟机中指定不同的监听地址。
例如:
<VirtualHost *:80>
DocumentRoot "/web/a"
ServerName www.a.com
<FilesMatch \.php$>
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
# 或者
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
</VirtualHost>

6.2:nginx与php
指定不同的监听地址
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
}
参考
  • http://php.net/manual/zh/install.php(官网安装帮助文档)
  • http://cnzhx.net/blog/apache-httpd-mod_proxy_fcgi-php-fpm/
  • http://blog.csdn.net/u010861514/article/details/51926575
0%