php编译安装与配置
- php编译安装与配置
- ===========================================
- 官网:http://php.net/
- 官网下载:http://php.net/downloads.php
- ===========================================
- 一:了解与准备
- 1.1:Apache(httpd) nginx 与 php 连接方式:
- httpd与php:
- 1:php 作为 httpd 模块
- 2:fastcgi(php-fpm)
- 3:cgi(此处不讲解)
- nginx与php:
- 1:fastcgi(php-fpm)
- 1.2: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
- 1.3:备注:
- 1:上面的依赖基本解决所需要的依赖。
- 2:编译安装完成后可以增减所支持的php模块,此处所编译的模块已经非常完备。
- 3:需要编译单个模块,查看php模块编译方式:php模块编译
- 4:下面编译安装的配置选项:
- --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 文件路径。
- 其他的配置可以按自己需求指定,这几个选项也可以使用默认配置。
- 5:php7移除了 mysql 扩展,php7仅能是用 mysqli 和 pdo_mysql。php5可以使用。
- php5编译时加入选项:--with-mysql 。详情查看下面的 PHP与MariaDB(mysql)连接
- 6:此处以 CentOs7 编译 php7 为示例,配合讲解php5安装的要点。
- 7: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 目录。
- 8:PHP安装与依赖中 psmisc.x86_64 是 killall 命令的包名,以便最小化安装时终止进程。
- 二:php编译与配置:
- 2.1: httpd 模块
- 备注:需要事先存在httpd ,编译指定 apxs 文件位置。此处以--with-apxs2=/usr/local/httpd/bin/apxs 作为演示。
- php7:
- ~]# ./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
- php5.6:(仅增加了选项 --with-mysql=mysqlnd)
- ~]# ./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
- 2.2:fastcgi php-fpm 模式
- php7:
- ~]# ./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
- php5.6:(仅增加了选项 --with-mysql=mysqlnd)
- ~]# ./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
- 2.3:php.ini 配置文件(在源码包目录下)
- ~]# cp php.ini-production /etc/php7/php.ini
- 2.4:php 作为 httpd 模块
- 不需要修改 php 配置,
- 2.5: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 不必修改。
- ~]# vi /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 监听地址和允许的客户端。
- 2.6:启动与停止
- httpd模块:
- 重新加载 httpd 。
- fastcgi:
- ~]# vi /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`
- 2.7:加入环境变量
- ~]# vi /etc/profile.d/web.sh
- export PATH=$PATH:/usr/local/php7/sbin:/usr/local/php7/bin
- 2.8:CentOS 系统服务(/etc/php7/php-fpm.conf 文件 pid = run/php-fpm.pid 注释需要打开:2.6 )
- CentOS 6:
- ~]# vi /etc/rc.d/init.d/php-fpm
- ~]# chmod +x /etc/rc.d/init.d/php-fpm
- --------------------------file start---------------------------------
- #! /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
- --------------------------file end---------------------------------
- ~]# service php-fpm {start|stop|status|restart|reload|force-reload|condrestart|try-restart|configtest}
- CentOS 7:
- ~]# vim /usr/lib/systemd/system/php-fpm.service
- --------------------------file start---------------------------------
- [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
- --------------------------file end---------------------------------
- ~]# systemctl (start | restart | reload | stop | enable | disable | status) php-fpm.service
- 2.8:系统启动服务
- CentOS 6:
- 加入 chkconfig 管理:
- ~]# chkconfig --add php-fpm
- 开机启动:
- ~]# chkconfig --level 345 php-fpm on
- 开机不启动:
- ~]# chkconfig php-fpm off
- 查看开机是否启动
- ~]# chkconfig --list php-fpm
- CentOS 7:
- 开机启动:
- ~]# systemctl enable php-fpm.service
- 开机不启动:
- ~]# systemctl disable php-fpm.service
- 2.9:加入 man 文档
- CentOS 6:
- ~]# vim /etc/man.config
- CentOS 7:
- ~]# vi /etc/man_db.conf
- 写入:
- MANPATH /usr/local/php7/php/man
- 备注:然后就可以使用 man 命令查看
- 三:httpd nginx 与 php 连接
- 3.1: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 也可以应用
- 3.2: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 更方便在本地使用,2和3一般会使用远程 php 服务器上。
- 3.3: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:添加文件与内容
- ~]# vi /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;
- }
- 七:推荐博客
- 6.1:官网安装帮助文档:http://php.net/manual/zh/install.php
- 6.2:http://cnzhx.net/blog/apache-httpd-mod_proxy_fcgi-php-fpm/