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

卸载php 5

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

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

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

添加源

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

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

1
2
3
add-apt-repository ppa:ondrej/php
apt-get update
apt-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文件。

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

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

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

1
listen = 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等,所以需要关闭推荐安装的软件。

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

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

 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
<span style="color: #008000;">/* Select mysqli if your server has it */</span>
$cfg['Servers'][$i]['extension'] = 'mysqli';
<span style="color: #008000;">/* Optional: User for advanced features */</span>
$cfg['Servers'][$i]['controluser'] = $dbuser;
$cfg['Servers'][$i]['controlpass'] = $dbpass;
<span style="color: #008000;">/* Optional: Advanced phpMyAdmin features */</span>
$cfg['Servers'][$i]['pmadb'] = $dbname;
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';

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

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

缺少 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
2
3
; configuration for php mcrypt module
; priority=20
extension=mcrypt.so

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