10-编译PHP并与nginx整合

Posted 绿茵好莱坞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10-编译PHP并与nginx整合相关的知识,希望对你有一定的参考价值。

nginx的URL重写。nginx+php的配置也是不可不学的部分。PHP自己手动编译,mysql就自己yum了。



yum install 安装mysql


同时进行php的编译,手动编译php

 这么多的选项不要记,记也没用。你随时编译什么软件你看它的configure -help,帮助,是否包含mysql的支持?DIR是mysql的base(基础目录),php自带了原生的mysql驱动,不需要依赖于mysql的目录了。你要是想用原生的mysql驱动可以指定为mysqlnd。如果mysqli没有值默认为mysqlnd。肯定得开启mysqlnd。


还需要gd库支持,这些东西你需要什么就随时去找。死记硬背是没有任何意义的。你的gd库装在哪里?你手动装的gd那你指定,你要是没有手动编译gd那你直接先yum安装一下。

得清除yum源并且重新配置本地光盘为yum源

ttf是写字的,字体功能,gd是画图,画图上你想写字还得有字体。


安装字体相关的软件

 

把ttf的选项--enable-gd-native-ttf加上去php的编译命令


 再看看有没有安装freetype


 编译安装php的命令:./configure --prefix=/usr/local/fastphp \\

--with-mysql=mysqlnd \\

--enable-mysqlnd \\

--with-gd \\

--enable-gd-native-ttf \\

--enable-gd-jis-conf

至此,把php编译在哪里,mysql要支持,gd库要支持,字体库要支持,可以动手编译了。

 

缺少了libxml2,编译不成功


libxml2已经安装了

yum clean all之后删除掉packagekit-media.repo就意味着yum源被重新配置了,然后yum安装libxml2-devel成功


重新编译安装php又报错了,少了png.h,png.h是头文件,头文件少了肯定是缺少了devel系列的包。没有头文件,头文件里面有一些数据结构它必须要利用。

经查资料说是libpng,devel包没安装,执行下面两条命令即可解决yum install libpng,yum install libpng-devel,然后重新编译安装就行了

又报这个错,还是重新配置yum源吧。

又来了,不断地重复yum clean all然后删除掉packagekit-media.repo以重新配置yum源。

安装libpng-devel成功了


 编译安装PHP成功


试一下安装gd-devel

又来了,又是yum源的问题

重新配置yum源之后再安装,没有gd-devel的包可以安装。


  编译安装php的命令应该改为:./configure --prefix=/usr/local/fastphp \\

--with-mysql=mysqlnd \\

--enable-mysqlnd \\

--with-gd \\

--enable-gd-native-ttf \\

--enable-gd-jis-conv

经过漫长的等待,php终于编译成功了,编译完毕了。


php不是要以一个进程的方式在跑吗?管理php进程的那个东西叫做fastcgi_process_manager程序,它现在没有给我们产生conf。


嘴里念叨着四个选项还是少了些选项。你得说你是fpm形式,它才能以独立进程编译。

使用新的选项

修改配置php的命令:

./configure --prefix=/usr/local/fastphp \\

--with-mysql=mysqlnd \\

--enable-mysqlnd \\

--with-gd \\

--enable-gd-native-ttf \\

--enable-gd-jis-conv \\

--enable-fpm

必须要声明enable-fpm才可以,然后用新的选项把它configure,make&&make install

编译安装

一不小心落了一个参数,二十分钟白费了,又要重新编译。一定要在编译之前好好看看你的参数。为什么非得加fpm?因为nginx和php是平级的,都是各自独立的进程,所以要把php编译成fpm的形式。


整合php和nginx


因为nginx和php是两个独立的进程,因此它俩要通信要说话。

不灵


进行调试

 

修改:

为什么差一点就不行?fastcgi通俗意思是两个程序之间说话,程序之间说话肯定少不了N多变量而且是约定成俗的变量。刚才你要是不包含的话(include fastcgi_params)会少了很多东西。缺少了很多变量PHP不知道怎么解释,你得给人充分的变量才行。


PHP已经安装成功了

gd库已经安装了

mysql也支持

有mysql有gd库就已经够了,现在php已经安装完毕了。和nginx也整合完毕了。


 


启动mysql失败

还差一个,刚才装的只是客户端,还要装mysql-server。

mysql-server服务器和mysqld已经安装,查看mysql日志应该是磁盘空间满了,删除掉之前nginx日志切割课程的日志文件应该就可以了。经查nginx日志才147KB,看来不是大容量文件。

 

 

 


nginx和php是怎么配合的?

php是嵌入式嵌入apache当做它的小功能块。nginx和php的关系是平等的。php占着9000端口当做一个独立的进程在运行着。nginx收到请求发现想运行php,把你的相关请求信息原封不动地送给php。php处理完毕再返回给nginx,nginx再返回给用户。这是两者的不同之处。针对.php文件做一次转发,转发给php进程。nginx和php是相互独立的,只要碰到.php的请求直接原封不动转给php进程来请求。不等php编译好先去帮nginx配置。知道原理了又会location了你就知道该怎么做了。


配置nginx  配置nginx.conf

正则匹配,当碰到.php的时候,这件事不能由我处理了,得由php进程来处理了。php进程运行的时候在哪一个端口?咱们应该告诉人家。fastcgi就是你接收到的这一系列请求的上下文的变量,通过9000端口来处理。9000端口将是谁来运行呢?就是由php来运行。


当location(定位),当它碰到.php的这种文件的时候,它就把浏览器给它的一系列信息原封不动地给9000端口,让9000端口去处理。给9000端口去处理的时候你总得让php这个进程知道你来找a.php还是b.php,你得让人家知道你来找哪个php啊。所以cgi里面有一个参数,这是cgi标准定的,cgi里面有一个参数叫做fastcgi_script_name,就告诉了php说你去找/scripts$fastcgi_script_name(scripts目录下的fastcgi_script_name这个文件名)。scripts目录是干什么的?就是你的php放哪个目录你得说清楚。总之这个location是:现在有人要访问php文件,原封不动地把它转到9000端口,同时告诉这个9000端口我要找的是$document_root$fastcgi_script_name这个文件名来执行。也就是说9000端口的php请帮我执行$docuemnt_root$fastcgi_script_name这个php,执行结果返回给nginx。


实际上原理就是说:

以上是关于10-编译PHP并与nginx整合的主要内容,如果未能解决你的问题,请参考以下文章

debian系统安装最新lnmp编译最新php7.1.2及nginx1.10.3及mysql5.7及5.6

CentOS6.8编译安装Nginx1.10.2+MySQL5.7.16+PHP7.0.12

Centos7编译安装nginx1.15+MariaDB10.3+php-7.2

CentOS 7.2.1511 编译安装Nginx1.10.1+MySQL5.7.14+PHP7.0.11

centos6.8服务器配置之编译安装PHP配置nginx

如何编译搭建php7+nginx+mysql