PHP总共有三个模块:内核、Zend引擎、以及扩展层;
PHP内核用来处理请求、文件流、错误处理等相关操作;
Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;
php-fpm是一个完全独立的程序,不依赖php-cgi,也不依赖php.因为php-fpm是一个内置了php解释器的FastCGI服务,启动时能够自行读取php.ini配置和php-fpm.conf配置.
附:PHP FastCGI进程管理器PHP-FPM的架构
一个master进程,支持多个pool,每个pool由master进程监听不同的端口,pool中有多个worker进程.
每个worker进程都内置PHP解释器,并且进程常驻后台,支持prefork动态增加.
每个worker进程支持在运行时编译脚本并在内存中缓存生成的opcode来提升性能.
每个worker进程支持配置响应指定请求数后自动重启,master进程会重启挂掉的worker进程.
每个worker进程能保持一个到MySQL/Memcached/Redis的持久连接,实现"连接池",避免重复建立连接,对程序透明.
master进程并不接收和分发请求,而是worker进程直接accpet请求后poll处理.
master进程不断调用epoll_wait和getsockopt是用来异步处理信号事件和定时器事件.
这里提一下,Nginx也类似,master进程并不处理请求,而是worker进程直接处理,
不过区别在于Nginx的worker进程是epoll异步处理请求,而PHP-FPM仍然是poll.
如果worker进程不够用,master进程会prefork更多进程,
如果prefork达到了pm.max_children上限,worker进程又全都繁忙,
这时master进程会把请求挂起到连接队列backlog里(默认值是511).
Nginx跟PHP-FPM分开,其实是很好的解耦,PHP-FPM专门负责处理PHP请求,一个页面对应一个PHP请求,
页面中所有静态资源的请求都由Nginx来处理,这样就实现了动静分离,而Nginx最擅长的就是处理高并发.
PHP-FPM是一个多进程的FastCGI服务,类似Apache的prefork的进程模型,
对于只处理PHP请求来说,这种模型是很高效很稳定的.
1、 安装PHP5
安装PHP5与PHP7参考链接:https://my.oschina.net/u/3707523/blog/1593424
• PHP官网www.php.net
• 当前主流版本为5.6/7.1
• cd /usr/local/src/ # 安装软件存放的目录
• 安装插件预防安装过程遇见问题
• yum install openssl openssl-devel bzip2-devel libjpeg-devel libpng-devel libmcrypt-devel fretype freetype-devel epel-release libmcrypt-devel expat-devel #安装插件
•wget http://cn2.php.net/distributions/php-5.6.30.tar.gz
• tar -zvxf php-5.6.30.tar.gz
• cd php-5.6.30
• ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif
在解压的目录执行以下代码,配置编译参数:
- ./configure
- --prefix=/usr/local/php #PHP安装目录
- --with-apxs2=/usr/local/apache2/bin/apxs #表示使用Apache2.0以上版本
- --with-config-file-path=/usr/local/php/etc #指定php.ini位置
- --with-mysql=/usr/local/mysql #mysql安装目录,对mysql的支持
- --with-pdo-mysql=/usr/local/mysql
- --with-mysqli=/usr/local/mysql/bin/mysql_config #mysqli安装目录,优化支持
- --with-libxml-dir #打开libxml2库的支持
- --with-gd #打开gd库的支持
- --with-jpeg-dir #打开对jpeg图片的支持
- --with-png-dir #打开对png图片的支持
- --with-freetype-dir #打开对freetype字体库的支持
- --with-iconv-dir #关闭iconv函数,种字符集之间的转换
- --with-zlib-dir #打开zlib库的支持
- --with-bz2 #打开对bz2文件的支持
- --with-openssl #openssl支持,加密传输时用到
- --with-mcrypt #算法
- --enable-soap
- --enable-gd-native-ttf #支持TrueType 字符串函数库
- --enable-mbstring #多字节,字符串的支持
- --enable-sockets #打开sockets支持
- --enable-exif #图片的元数据支持
• make && make install
• cp php.ini-production /usr/local/php/etc/php.ini
实例:
编译安装php5, cd /usr/local/src/切换到软件安装目录
查看安装包的大小。
然后解压缩包。tar -zvxf php-5.6.30.tar.gz,切换目录cd php-5.6.30
到这一步就回车。
使用echo $?查看上一个命令是否正确。
安装需要的包
安装好,需要的包,之后再编译一次。
安装openssl-devel
按照上面的指示,安装bzip软件包。
再编译安装一次。
继续编译。(当编译过程出现问题时,就安装需要的包,然后再编译,看看是否还有错误。)
先安装扩展源。命令:yun install -y epel-release。因为这个包在扩展源里里面。
继续编译。
编译完成图。
./configure 安装完成了,编译好后,下一步。
2、 安装PHP7
• cd /usr/local/src/
• wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2
• tar jxf php-7.1.6.tar.bz2
• cd php-7.1.6
• ./configure --prefix=/usr/local/php7 --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php7/etc --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif
• make && make install
• ls /usr/local/apache2.4/modules/libphp7.so
• cp php.ini-production /usr/local/php7/etc/php.ini
实例:
安装PHP7
[root@ocalhost ~]# cd /usr/local/src/
[root@localhost ~] # wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2
[root@localhosts ~]# tar -jvf nginx-1.10.2.tar.gz
[root@localhost ~]# cd php-7.1.6
[root@localhost /php-7.1.] # ./configure --prefix=/usr/local/php7 --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php7/etc --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif
[root@localhosts php-7.1.6]# make
[root@ocalhost php-7.1.6] # make install
[root@localhost php-7.1.6] # ls /usr/local/apache2.4/modules/libphp
libphp5.so libphp7.so
[root@localhosts php-7.1.6]# ls /usr/local/apache2.4/modules/libphp7.so
/usr/local/apache2.4/modules/libphp7.so
[root@localhosts php-7.1.6]# du -sh !$
37M /usr/local/apache2.4/modules/libphp7.so
[root@localhosts php-7.1.6]# /usr/local/php7/bin/php -m #查看php7加载的模块
[root@localhosts php-7.1.6]# /usr/local/apache2.4/bin/apachectl -M #查看apache加载的php
[root@ocalhost php-7.1.6]# !vim
vim /etc/init.d/mariadb
[root@localhosts php-7.1.6]# vim /usr/local/apache2.4/conf/httpd.conf
/php5.so #搜索的内容
# LoadModule php5_module modules/libphp5.so #注释掉php5
LoadModule php_module modules/libphp7.so #这两个模块要注释掉其中一个
常见问题:
1、问题:需要安装的包名,不对。
2、使用yum install httpd就可以安装httpd,为什么还要这样使用源码包安装呢?是因为有功能的差异吗?
答:主要目的是要学习编译安装这个技能。 多数企业也是习惯使用编译安装的。
3、./configure是不是就是在编译?
make就是编译后的安装?
make和make && make install有什么区别?
生成makefile的作用是什么?
答:
./config 预编译,检查系统是否能够满足软件包编译环境,系统是否存在GCC编译器+依赖的软件库,生成Makefile文件。
make 是编译,基于第一步生产的makefile文件用于指定编译的步骤和顺序,包括编译时依赖的软件包记录,make生成二进制文件。
make install是安装,将二进制文件cp或安装到linux系统目录中,供用户或者程序去使用;
没有Makefile 就没办法make
4、配置安装的时候,提示: configure: WARNING: unrecognized options: --enable-gd-native-tty。 是说明 --enable-gd-native-tty 这个参数废弃了吗? 还是有其他的问题?
答:废弃啦。 去掉它吧。
5、编译不成功
答:apr以及apr-util都需要编译安装。
6、当/usr/local/apache2.4/conf/httpd.conf中,php5和php7模块都没注释掉,会默认使用哪个呢?
答:会冲突,要注视掉一个。
7、make编译不了
答:缺xml解析依赖,安装expat-devel,命令:yum install -y expat-devel,
安了expat要重新编译apr-util
8、: configure: error: mcrypt.h not found. Please reinstall libmcrypt.
解决方案:
yum -y install epel-release
yum -y install php-mcrypt
yum -y install libmcrypt-devel
9、安装mysql 再弄MariaDB的时候 容易冲突(原因端口一样 都是21端口)
答: 你把/data/mysql 整个目录干掉。就不会冲突了.
10.
答:
./configure是源代码安装的第一步,主要的作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系,但并不是所有的tar包都是源代码的包,楼主可以ls看看有没有configure这个文件,也许你下的是二进制的包,如果是二进制的包,解压后直接就能使用。 二进制的mysql包,可以放到任意位置,所有的命令都是解压后目录的bin目录下,你要想在任意目录都能使用mysql的命令,需要把bin目录加到PATH环境变量中,比如你的mysql目录是/usr/local/mysql,你可以这样添加环境变量,vi ~/.bash_profile在文件的最后面添加 PATH=$PATH:/usr/local/mysql/bin export PATH 然后执行source ~/.bash_profile 这样就可以在任意目录执行mysql的所有命令了
11.缺少依赖的包
答案:安装yum install -y
php中mysql,mysqli,mysqlnd,pdo到底是什么 http://blog.csdn.net/u013785951/article/details/60876816
查看编译参数 http://ask.apelearn.com/question/1295
安装参考链接:https://www.cnblogs.com/nfyx/p/9086038.html
链接 :
修改Apache配置指定php配置文件php.ini的位置方法 :https://www.jb51.net/article/106111.htm
https://www.jb51.net/article/58872.htm
PHP 性能分析第一篇: Intro to Xhprof & Xhgui : https://www.cnblogs.com/thrillerz/p/5072407.html
PHP 性能分析第二篇: Xhgui In-Depth : https://www.cnblogs.com/thrillerz/p/5072407.html
PHP 性能分析第三篇: 性能调优实战 :https://www.cnblogs.com/thrillerz/p/5085307.html
PHP : https://www.cnblogs.com/thrillerz/category/601879.html