背景

最近接了个小外包项目,因为不仅要写后端还要写前端,我就选择了 PHP 中的 CodeIgniter 来实现,因为最开始接触 PHP 就是用这个框架来实现项目的,CodeIgniter 只要加载几个主要文件就可以运行了,很简单;开发也很自由,很快。我觉得 ThinkPHP 是用来写移动端H5之类的框架,Laravel 比较重是用来写大型项目的,yii 也是写大型应用的,现在正用的 PhalApi 是专门用来写接口的,一个小外包项目还不至于前后端分离来实现,所以就没选这些框架,Python 和 Go 也不太适合做这种小 web 应用项目,就用了我 PHP 道路上的启蒙框架 CodeIgniter。CodeIgniter(CI)在Nginx 下需要特别的配置才可以使用,这篇主要就是记录下在 Nginx 下搭建 CodeIgniter 遇到的一些问题。

问题集锦

数据库驱动连接失败

报错信息如下:

A PHP Error was encountered
Severity: Warning
Message: mysqli::real_connect(): (HY000/2002): No such file or directory
Filename: mysqli/mysqli_driver.php

解决方法
这个问题是 php.ini 配置的问题。
默认以下配置为空,将以下三个选项设置成你 mysql.sock 对应的目录就可以解决了。(以下配置为Linux下)

mysql.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket= /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

Only variable references should be returned by reference

报错信息如下:

A PHP Error was encountered
Severity: Notice
Message: Only variable references should be returned by reference
Filename: core/Common.php
Line Number: 257

解决方法

原代码:
return $_config[0] = & $config;

修改后:
$_config[0] = & $config;
return $_config[0];

Session报错

报错信息如下:

A PHP Error was encountered
Severity: Warning
Message: mkdir(): Invalid path
Filename: drivers/Session_files_driver.php
Line Number: 117

解决方法

将 config 配置文件中 sess_save_path 改为如下
$config['sess_save_path'] = FCPATH.'public/sess_save_path';

Url重写

在 CI 框架下,有一个默认的 controller,叫 welcome。需要通过这样的方式访问
http://www.example.com/index.php/welcome/index。如果我们想要以 http://www.example.com/welcome/index 这样访问URL,就需要 nginx 的 rewrite。同时因为不去除 index.php 的话,用 Jquery post 请求会有问题。

CodeIgniter修改

application/config/config.php 进行修改。

$config['base_url'] = 'http://dev.lyafei.com';

$config['uri_protocol'] = "PATH_INFO";

修改Nginx配置

对 nginx 的进行配置,nginx.conf

server {
    listen 80;
    server_name dev.lyafei.com;
    access_log /data/wwwlogs/access_nginx.log combined;
    root /data/wwwroot/storage-management-work;
    index index.html index.htm index.php;
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    location /nginx_status {
      stub_status on;
      access_log off;
      allow 127.0.0.1;
      deny all;
    }
    location / {
      #这里使用try_files进行url重写,不用rewrite了。
      try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ [^/]\.php(/|$) {
      #fastcgi_pass remote_php_ip:9000;
      fastcgi_pass unix:/dev/shm/php-cgi.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
      expires 30d;
      access_log off;
    }
    location ~ .*\.(js|css)?$ {
      expires 7d;
      access_log off;
    }
    location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
      deny all;
    }
}

要特别注意 include fastcgi_params;,如果没有这一行,那么你的 PHP 程序会无法运行的。

最后修改:2020 年 06 月 09 日 12 : 47 PM
如果觉得我的文章对你有用,请随意赞赏