折腾搬瓦工–08–升级到PHP 7

Overview

在把博客搬到VPS后,首先做的就是一些性能优化,包括开启缓存和GZIP,前台的页面大多有缓存加速,不过在后台界面,仍然还是偶尔卡顿,本来打算启用HHVM,但正好看到一篇关于PHP 7的性能测试,相比PHP 5它占据更少的内存,而在性能上不输HHVM,升级过程中,只遇到了两个小问题,一个是需要将原来的php5相关软件全部卸载,二是又遇见了phpmyadmin高级功能激活的问题。下面是正文。

卸载php 5

首先停止Nginx和php5-fpm的服务,然后罗列出本地安装过的php相关软件。

1service nginx stop
2service php5-fpm stop
3dpkg --get-selections|grep php

罗列出的php相关软件应该包括php5-mysql,php5-fpm......使用 apt-get purge命令,将它们连同它们在/etc目录下的配置文件一并移除。但如果这些配置文件夹被修改过或者增加了一些文件,它们就不会被完全删除,另外由于我安装过phpmyadmin,在卸载时,会提示是否将phpmyadmin用户及对应的数据库删除,我选择了删除。

添加源

ubuntu的所有第三方源都可以在这里找到:launchpad.net

添加php的源,更新源后安装相关软件,就完成了安装。

1add-apt-repository ppa:ondrej/php
2apt-get update
3apt-get install php7.0 php7.0-cli php7.0-common php7.0-fpm php7.0-json php7.0-mbstring php7.0-mcrypt php7.0-mysql php7.0-opcache php7.0-readline php7.0-xml

配置PHP7

由于安装后,php7.0-fpm默认使用unix套接字监听请求,如果nginx的配置中是使用TCP/IP传递FastCGI请求的话,就会有问题,我的nginx主机中对php的处理配置如下,将cgi请求传递给本地端口9000,允许分割路径,执行子目录下的php文件。

1location ~ \.php$ {
2                try_files $uri =404;
3                fastcgi_pass 127.0.0.1:9000;
4                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
5                include fastcgi_params;
6        }

需要修改的文件为 /etc/php/7.0/fpm/pool.d/www.conf

使用vi打开,搜索listen,修改如下

1listen = 127.0.0.1:9000

在这个文件中,默认的user与group已经设置为www-data,所以无需做其他的修改了,对于 cgi.fix_pathinfo 的问题,在新的php版本中已经修复,不需要再去修改/etc/php/7.0/fpm/php.ini文件了。

安装与配置phpmyadmin

如果使用apt-get命令直接安装phpmyadmin的话,会额外安装许多软件,包括php5,apache等,所以需要关闭推荐安装的软件。

1apt-get --no-install-recommends install phpmyadmin

之前为了安全,修改了mysql的默认root账号,结果在安装phpmyadmin时,由于它默认使用root账号来创建phpmyadmin账户以及同名的数据库,在卸载时,也会使用,导致安装后出现了常见的问题:

phpmyadmin 高级功能尚未完全设置 部分功能未激活

这个真的很烦人,即使没有修改root账号,也时不时出现,原因:phpmyadmin需要一个名称为phpmyadmin的账号,这个账号需要对同名的数据库拥有完整的增删改查权限。所以我们可以手动创建一个phpmyadmin用户和同名的数据库,这些都可以phpmyadmin中完成。选中phpmyadmin数据库后,导入 /usr/share/phpmyadmin/sql目录下 create_tables.sql 文件,会创建以下表:

 1+------------------------+
 2| Tables_in_phpmyadmin |
 3+------------------------+
 4| pma__bookmark          |
 5| pma__central_columns   |
 6| pma__column_info       |
 7| pma__designer_settings |
 8| pma__export_templates  |
 9| pma__favorite          |
10| pma__history           |
11| pma__navigationhiding  |
12| pma__pdf_pages         |
13| pma__recent            |
14| pma__relation          |
15| pma__savedsearches     |
16| pma__table_coords      |
17| pma__table_info        |
18| pma__table_uiprefs     |
19| pma__tracking          |
20| pma__userconfig        |
21| pma__usergroups        |
22| pma__users             |
23+------------------------+

phpmyadmin的配置文件夹在 /etc/phpmyadmin 目录下,需要修改的文件有两个config.inc.php、config-db.php,前者在 /usr/share/phpmyadmin 目录下有对应的模版文件config.sample.inc.php,可以将它复制过来,确保清除phpmyadmin数据库所有的表之前的注释,如下所示。

 1/* Select mysqli if your server has it */
 2$cfg['Servers'][$i]['extension'] = 'mysqli';
 3/* Optional: User for advanced features */
 4$cfg['Servers'][$i]['controluser'] = $dbuser;
 5$cfg['Servers'][$i]['controlpass'] = $dbpass;
 6/* Optional: Advanced phpMyAdmin features */
 7$cfg['Servers'][$i]['pmadb'] = $dbname;
 8$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
 9$cfg['Servers'][$i]['relation'] = 'pma__relation';
10$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
11$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
12$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
13$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
14$cfg['Servers'][$i]['history'] = 'pma__history';
15$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
16$cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords';
17$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
18$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
19$cfg['Servers'][$i]['recent'] = 'pma__recent';
20$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
21$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
22$cfg['Servers'][$i]['users'] = 'pma__users';
23$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
24$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
25$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
26$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
27$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
28$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';

其中dbuser,dbpass,dyname三个变量在config-db.php中配置,如果忘记phpmyadmin的密码,或者它的密码是自动生成的,可以直接用openssl来生成一个复杂密码,然后修改phpmyadmin用户的密码。

另外偶尔还会碰到这个问题:

1缺少 mcrypt 扩展。请检查 PHP 配置

而且即使安装了php5-mcrypt,或者php7.0-mcrypt,还是解决不了这个问题,原因:在mods-available文件下没有生成对应的 mcrypt.ini文件,php5的可用模块文件夹是 /etc/php5/mods-available/,而到了php7,它是在 /etc/php/7.0/mods-available/ 中,在对应目录下新建一个mcrypt.ini文件,内容如下

1; configuration for php mcrypt module
2; priority=20
3extension=mcrypt.so

可以参考同目录下的其他文件内容,基本相同的。