- 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/