前言

昨天我姐突然找我要我帮忙写一个网页让她参加一个比赛,由于时间比较紧就一晚上的时间,我看过比赛规则之后发现与其做一个表达某一主题的交互性网页不如写一个有功能性的网站系统。前者考验的是前端的知识,还要求表达某一主题,想想就头大;而后者只需要写一些简单的逻辑随意完善一下前端就基本能用,所以我果断放弃了前者而选择完成后者。

项目构思过程中想到自己之前给学院写过一个简陋的选课系统改改应该就能用,但是整个改起来有很麻烦,所有放弃了。而我最近恰好在用 ThinkPHP5 写项目,遇到一些问题,正好拿这次给我姐帮忙的机会练练手,以下是我在完成这个简陋项目的过程中遇到的一些坑,记录下来,方便后人[其实更多是怕自己忘了]。

本次项目配置:

主机:京东云学生机
系统:Centos7
环境:Nginx 1.12.2 + PHP7 + MariaDB
框架:ThinkPHP5 5.0 + Bootstrap 4

1. ThinkPHP5 静态资源加载

说起这个静态资源加载可真的是一把心酸泪呀,各种路径问题[绝对、相对],还有前段时间写 WordPress 主题也是,需要通过各种内置钩子或函数模版来解决路径问题;

解决 ThinkPHP5 的 CSS , JS 静态资源加载我采用的是官方手册给出的视图模版函数 {load href="/..." /} 在视图模版中引入此函数并设置静态资源位置,函数会自动识别引入文件是 CSS 文件还是 JS 文件从而选择不同的引入方式;官方手册本章节地址

  • 注意 href="/..."/ 指的是 public 目录 [即入口目录]

解决 ThinkPHP5 的其他静态资源[图片等]加载我采用的是设置视图输出字符串内容替换,即修改 app/config.php 下的 view_replace_strview_replace_str 具体修改方法请参考:官方手册本章节地址

2. 迁移过程数据库同步

我用的数据库管理软件 Navicat for MySQL 设想是:先将本地数据库导出 SQL 文件,再链接服务器数据库建立同名数据库将 SQL 导入,再修改 ThinkPHP5 数据库配置文件实现同步。在这个过程中遇到一个问题就是无论怎么刷新软件都显示不出我建立的数据库,然后突然想起之前联系数据库安全设置的时候给远程账号设置过权限,因此又去百度找之前的修改方式[后悔当时没记录下来],命令如下:

GRANT ALL PRIVILEGES ON databasename.* TO 'root'@'which ip you want' IDENTIFIED BY 'yourpassword'  WITH GRANT OPTION;

这条命令的大体意思是允许通过 which ip you want 使用 root 和 yourpassword 登陆的人获取 databasename 数据库的全部权限,命令可以修改的点也是这几个点,当然如果你要修改用户名首先要确定你的 MySQL 中有这个用户,而且要注意这是一条 MySQL 命令是需要进入 MySQL 环境输入才管用的。

3. ThinkPHP5 的 Nginx 配置

解决了前两个小坑之后迎来了第一个大坑,就是 Nginx 的配置问题,我让这个配置绕了好几圈才弄明白,接下来我直分享正确的结题思路不再赘述我踩的坑了。

  1. 为什么要配置 Nginx ?

因为 ThinkPHP5 采用了路由系统,而默认配置的 Nginx 无法识别 ThinkPHP5 产生的 url 导致 404 ,另外有时候我们需要隐藏 ThinkPHP 的入口文件;

  1. 主要修改 Nginx 配置文件的哪几个点?

我们主要修改配置文件中 server {} 中的三处地方:
首先在 server_name 下设置 $root 变量 : set $root /app/www/mydomain.vm/public;;
然后再 location / {} 中修改 root 并添加正则匹配规则;
最后设置 location ~ .+\.php($|/) {} 使网站解析 PHP 文件并识别 ThinkPHP5 路由产生的 url;

  1. 具体配置文件如下:

在配置中我们默认:
1. 配置文件使用 vhost 方式,如果单主机的酌情修改;
2. 假定配置的域名是 mydomain.vm ;
3. 假定用户使用的是 Linux 操作系统;
4. 假定项目文件部署在 /app/www/mydomain.vm 目录下;
5. 假定 Nginx 的日志放在 /app/logs/nginx 目录下。

server {
    listen 80;
    server_name    mydomain.vm    www.mydomain.vm;      
    # 设置服务器名称[推荐保持默认设置]
    access_log    /app/logs/nginx/mydomain_access.log;  
    # 设置Nginx运行日志位置[推荐保持默认设置]
    error_log    /app/logs/nginx/mydomain_error.log;    
    # 设置Nginx错误日志位置[推荐保持默认设置]
    set        $root    /app/www/mydomain.vm/public;    
    # 设置Nginx解析根目录[即网站根目录,这里一般设置为ThinkPHP5的入口文件目录]
    location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
        root $root;
    }
    location / {
        root    $root;
        index    index.html index.php;
        if ( -f $request_filename) {                     
        # 设置正则匹配规则隐藏入口文件
            break;
        }
        if ( !-e $request_filename) {
            rewrite ^(.*)$ /index.php/$1 last;
            break;
        }
    }
    location ~ .+\.php($|/) { 
        # 这个地方一定注意,我们修改了原先的php文件匹配规则
        set $script $uri;    
        # 以下为设置 Ngxin 识别 ThinkPHP5 路由产生的 url
        set $path_info "";
        if ($uri ~ "^(.+\.php)(/.+)") {
            set $script $1;
            set $path_info $2;
        }
        fastcgi_pass     127.0.0.1:9000;  
        # 设置为 php-fpm 运行端口,让 php-fpm 解析 php 文件
        fastcgi_index    index.php?IF_REWRITE=1;  
        # 下面这些设置具体是做什么的我也不太清楚不过为必须设置不可省略
        fastcgi_param    PATH_INFO    $path_info;
        fastcgi_param    SCRIPT_FILENAME    $root$fastcgi_script_name;
        fastcgi_param    SCRIPT_NAME    $script;
        include        fastcgi_params;
    }
}

修改完配置文件之后记得重启一下 Nginx 。

4. php7 缺少 pdo 模块

解决方法:yum install -y php70-pdo
安装完成后重启 php-fpm

5. 缺少 pdo-mysql 模块

解决方法:yum install -y php70-mysql
安装完成后重启 php-fpm