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/