1 2 > 本文内容: CentOS 6.5 下升级php7 > 可在PC端的文章详情页,点击右下角的`汉堡按钮`展开菜单栏快速查看
PS: 如果要跟其他开发人员保持开发环境的统一,可以考虑VirtualBox + Vagrant
的方式,这里不再详述,可参考以下教程:使用 Vagrant 打造跨平台开发环境 Vgrant安装配置
这两天给公司的服务器都升级了nginx
和php7
nginx
的升级比较简单,不再赘述。 下面简单记录一下php7
(原版本是5.3.5
)的升级操作,及一些扩展的编译安装
1 以下操作都是基于`CentOS 6.5 64bit`系统
备份服务器 上阿里云备份磁盘快照
升级php7.0.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cd ~/your_download_dir #可以从PHP官网,也可以从github下载源码 #下载方法1: 去php官网下载7.0.0 wget http://hk2.php.net/get/php-7.0.0.tar.bz2/from/this/mirror #开始解压php7包 tar -xjf mirror && cd php-7.0.0 #下载方法2: 从GitHub下载php7源码 #注意: 由于master分支上的不一定是7.0.0,有可能是7.1.0等, #但是memcached扩展目前只支持7.0.0(截止2015.12.16),所以这里指定下载7.0.0的,不用master的 wget -c --no-check-certificate -O php7-src-PHP-7.0.0.zip https://github.com/php/php-src/archive/PHP-7.0.0.zip #开始解压php7包 unzip -q php7-src-PHP-7.0.0.zip && cd php-src-PHP-7.0.0
1 2 #安装编译php7时需要的依赖包 yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
1 2 #需要的话,先备份旧版本的php tar -zcvf /usr/local/php-old.tar.gz /usr/local/php/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #生成配置文件(如果下载的是源码,可能没有`configure`文件,则需要`buildconf`一下;如果有则不需要下面这步) ./buildconf #开始配置 ./configure --prefix=/usr/local/php \ --exec-prefix=/usr/local/php \ --bindir=/usr/local/php/bin \ --sbindir=/usr/local/php/sbin \ --includedir=/usr/local/php/include \ --libdir=/usr/local/php/lib/php \ --mandir=/usr/local/php/php/man \ --with-config-file-path=/usr/local/php/etc \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-mcrypt=/usr/include \ --with-mhash \ --with-mysqli=shared,mysqlnd \ --with-pdo-mysql=shared,mysqlnd \ --with-gd \ --with-iconv \ --with-zlib \ --with-openssl \ --enable-zip \ --enable-inline-optimization \ --disable-debug \ --disable-rpath \ --enable-shared \ --enable-xml \ --enable-bcmath \ --enable-shmop \ --enable-sysvsem \ --enable-mbregex \ --enable-mbstring \ --enable-ftp \ --enable-gd-native-ttf \ --enable-pcntl \ --enable-sockets \ --with-xmlrpc \ --enable-soap \ --without-pear \ --with-gettext \ --enable-session \ --with-curl \ --with-jpeg-dir \ --with-freetype-dir \ --enable-opcache \ --enable-fpm \ --with-fpm-user=php-fpm \ --with-fpm-group=php-fpm \ --without-gdbm \ --enable-fileinfo #编译 make clean && make && make install #测试——非必须操作 make test #需要的话,备份旧的php里的php.ini等文件 mv /usr/local/php/etc/php.ini /usr/local/php/etc/php.ini.old mv /etc/init.d/php-fpm /etc/init.d/php-fpm.old mv /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php-fpm.conf.old mv /usr/local/php/etc/php-fpm.d/www.conf /usr/local/php/etc/php-fpm.d/www.conf.old #设置PHP7的配置文件php.ini、php-fpm.conf、www.conf和php-fpm脚本 #方法一:直接使用编译后未经优化处理的配置 cp php.ini-production /usr/local/php/etc/php.ini cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf #方法二:使用 https://typecodes.com/web/php7configure.html 文中的配置 mv ~/php.ini /usr/local/php/etc/php.ini mv ~/php-fpm /etc/init.d/php-fpm mv ~/php-fpm.conf /usr/local/php/etc/php-fpm.conf mv ~/www.conf /usr/local/php/etc/php-fpm.d/www.conf #可能需要加上执行权限 chmod +x /etc/init.d/php-fpm #设置PHP的扩展库路径,下面是一个举例的路径,具体不同机器名字可能稍有不同 extension_dir = "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/"
1 2 3 4 5 6 7 8 #重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini #查看是否启动成功 ps -aux|grep php #查看php版本 php -v
php.ini相关配置优化 1 2 3 4 5 6 7 8 9 10 11 #设置PHP的时区,修改为 Asia/Shanghai 或 PRC date.timezone = Asia/Shanghai #避免PHP信息暴露在http头中 expose_php = Off #避免暴露php调用mysql的错误信息(如果是本地环境,可以设置为On,方便查看原因) display_errors = Off #在关闭display_errors后,开启PHP错误日志(路径在php-fpm.conf中配置) log_errors = On
执行命令:重启php
1 killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
php-fpm相关配置优化 1 2 3 4 5 6 7 #开启pid文件 pid = run/php-fpm.pid #设置错误日志的路径 error_log = log/php-fpm.log #确保php-fpm.conf里有include了php-fpm.d里的文件,再修改www.conf include=/usr/local/php/etc/php-fpm.d/*.conf
执行命令
1 vim /usr/local/php/etc/php-fpm.d/www.conf
修改www.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #修改为以下配置 pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 #开启慢日记 request_slowlog_timeout = 1 slowlog = log/$pool.log.slow #修改fpm运行的用户和组都为nobody user = nobody group = nobody #根据nginx.conf中的配置fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;设置PHP监听 ; listen = 127.0.0.1:9000 #####不建议使用 ; listen = /var/run/php-fpm/php-fpm.sock #由于以前的vhost里的配置文件大都是用127.0.0.1:9000,等以后有时间再来改为sock
执行命令
1 2 3 4 5 #测试PHP的配置文件是否正确 /usr/local/php/sbin/php-fpm -t #重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
opcache扩展 1 2 3 4 5 6 7 8 9 10 11 12 13 #注意:建议本地环境非必要情况下不要开启opcache, 正式环境才开启 #进入到刚才解压后的php源码路径里的opcache目录 cd ext/opcache/ phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-opcache make clean && make && make install #成功之后的so文件路径会显示出来,注意查看 #编辑php.ini vim /usr/local/php/etc/php.ini
修改php.ini配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #确保 extension_dir 的路径有填写了,如果没填可参照以下填写,或是自定义一个路径 extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012" #添加以下东西,其他opcache选项再自己具体去修改 zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 #Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB),推荐 128 opcache.memory_consumption=128 #Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB),推荐 8 opcache.interned_strings_buffer=8 #最大缓存的文件数目 200 到 100000 之间,推荐 4000 opcache.max_accelerated_files=4000 #Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒,推荐60 opcache.revalidate_freq=60 #是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释.推荐 0 opcache.save_comments=0 #打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高,推荐1 opcache.fast_shutdown=1 #从缓存不被访问后,等待多久后(单位为秒)调度重启 opcache.force_restart_timeout=180
执行命令
1 2 3 4 5 #保存退出vim后,重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini #安装成功后,查看版本会有opcache的文字显示出来;或是自己弄个php文件去测试 php -v
mysql扩展 1 2 3 4 #先确保 mysqli.so、pdo_mysql.so 存在 ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012 vim /usr/local/php/etc/php.ini
修改php.ini配置
1 2 3 4 5 6 #确保 extension_dir 的路径有填写了,如果没填可参照以下填写,或是自定义一个路径 extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012" #添加 mysql 扩展 extension=pdo_mysql.so extension=mysqli.so
执行命令
1 2 #保存退出vim后,重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
php7下的memcached扩展 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #添加php7下的memcached扩展 cd ~/your_download_dir #下载 wget -c --no-check-certificate -O php7-memcached.zip https://codeload.github.com/php-memcached-dev/php-memcached/zip/php7 #解压 unzip -q php7-memcached.zip && cd php-memcached-php7 #编译,前提是已安装过 libmemcached,如未安装,请先自行安装,再执行以下命令 phpize ./configure --with-libmemcached-dir=/usr/local/libmemcached --with-php-config=/usr/local/php/bin/php-config make clean && make make test #拷贝生成的so文件至php目录里 cp modules/memcached.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/ cp modules/memcached.la /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/ vim /usr/local/php/etc/php.ini
修改php.ini配置
1 2 3 4 5 #确保 extension_dir 的路径有填写了,如果没填可参照以下填写,或是自定义一个路径 extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012" #在php.ini里添加扩展 extension=memcached.so
执行命令
1 2 #保存退出vim后,重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
php7下的redis扩展 1 2 3 4 5 6 7 8 9 10 11 12 13 # 下载redis wget http://download.redis.io/redis-stable.tar.gz # 解压并进入目录 tar -zxvf redis-stable.tar.gz && cd redis-stable # 编译 make && make install # 测试 make test # PS: 如果`make test`报这样的错误: `You need tcl 8.5 or newer in order to run the Redis test`,则还需执行以下命令 # yum install -y tcl
设置redis
开机自动启动,编辑redis.conf文件
1 2 # 编辑redis.conf文件 vim redis.conf
更改配置如下:
1 2 # 将`daemonize`由`no`修改为`yes` daemonize yes
复制刚才编辑的redis.conf文件:
1 2 3 # 复制至`/etc/redis`目录 mkdir /etc/redis cp redis.conf /etc/redis/
编写redis自启动脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 #在redis下载包中此路径: utils/redis_init_script,已经包含了自启动脚本,可以根据需要修改一些参数即可;或者直接新建一个脚本: vim /etc/init.d/redis # 脚本内容见下面附录: [redis自启动脚本] chmod +x /etc/init.d/redis # 设置开机自动启动服务 chkconfig redis on # 启动 service redis start # 停止 service redis stop
编译php7-redis扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 下载 wget -c --no-check-certificate -O phpredis-php7.zip https://codeload.github.com/phpredis/phpredis/zip/php7 # 解压并进入目录 unzip phpredis-php7.zip && cd phpredis-php7 # 编译(`phpize`依赖于`php-devel`这个包,如果没有直接用`yum install php-devel`先安装一下) phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-redis make && make install make test # 当出现类似如下语句时,说明安装成功 # Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/ ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/ # 编辑`php.ini` vim /usr/local/php/etc/php.ini
修改php.ini配置:
1 2 # 添加`redis.so`扩展 extension=redis.so
执行命令:
1 2 3 4 # 重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini # 使用<?phpinfo()?>查看有没有redis相关信息
修改上传文件最大范围为500M 1 2 #修改php.ini vim /usr/local/php/etc/php.ini
修改以下内容:
1 2 3 memory_limit = 128M upload_max_filesize = 500M post_max_size = 500M
执行命令:
1 2 #重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
修改nginx.conf:
1 2 #修改nginx vim /usr/local/nginx/conf/nginx.conf
修改以下内容:
1 2 #在 http{} 段内,修改或添加 client_max_body_size 500M;
执行命令:
1 2 #重启nginx nginx -s reload
Nginx相关配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #在nginx.conf的http{}里添加以下东西 #Gzip Compression gzip on; gzip_buffers 16 8k; gzip_comp_level 6; gzip_http_version 1.1; gzip_min_length 256; gzip_proxied any; gzip_vary on; gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon; gzip_disable "msie6"; #设置出错时不显示nginx版本 server_tokens off; #重启nginx nginx -s reload
phing相关配置 1 vim /usr/local/php/lib/php/phing/Phing.php
修改内容如下:
1 2 #添加这句代码,include php文件 ini_set('include_path', '/usr/local/php/lib/php');
执行命令:
1 2 #保存退出vim后,重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
上传大文件 大文件上传要注意几个环节:
上传文件需要花费较长上传时间和处理执行时间,需要设置 nginx
上传时间、延攻 php
执行超时时间
大文件处理需要占用较大内存,需要增加 php
内存池,考虑到有多个文件上传处理的并发,这个内存建议根据并发相乘
以下为相关配置(具体数值根据自己需要调整 )
注:nginx
中的 client_max_body_size
大小要和 php.ini
中的 upload_max_filesize
、post_max_size
中的 最大值 一致或者稍大,这样才不会因为提交数据大小不一致而出现错误
1 2 3 4 5 send_timeout 60; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; client_max_body_size 500M;
nginx
配置超时时间:参考文章
1 2 3 4 upload_max_filesize 500M post_max_size 512M max_input_time 300 max_execution_time 300
upload_max_filesize
和 post_max_size
区别: post数据,常用的就是form表单,表单数据不光有文件,还可以有其他数据,所以一般情况下,post_max_size
要设置得比 upload_max_filesize
大,具体大多少看需要,如果一个form表单要传多个文件,那就要设置很大了。 如果不用post,而用 socket
协议来上传文件,那么 post_max_size
设置就没有用处了。
1 2 3 # 这两个参数如果设置过小的话会导致文件传输了一部分后连接关闭。 request_terminate_timeout request_slowlog_timeout
最后记得重启 nginx
和 php
1 2 3 4 5 6 # 重启nginx nginx -t nginx -s reload # 重启php killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
参考文章
总结 配置服务器还是挺有意思的,尤其是编译时,画面上一行一行字闪过,那种感觉,真爽。。
1 2 3 4 #另外,可自行弄一个php文件查看机器上的php信息 <php? phpinfo(); ?>
最后可参考以下文章发挥php7性能:发挥PHP 7高性能的几个要点
redis自启动脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 ########################### #chkconfig: 2345 10 90 #description: Start and Stop redis PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 EXEC=/usr/local/bin/redis-server REDIS_CLI=/usr/local/bin/redis-cli PIDFILE=/var/run/redis.pid CONF="/etc/redis/redis.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $REDIS_CLI -p $REDISPORT SHUTDOWN while [ -x ${PIDFILE} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac ##############################
2015.12.16 00:32 Aevit 华师