CodeIgniter报错源于PHP扩展未启用:mysqli、pdo_mysql、mbstring、hash缺一不可,且需检查php.ini配置、extension_dir路径、disable_functions限制、opcache缓存及Web服务器重写规则,并统一PHP版本来源。

PHP扩展没加载,CodeIgniter报错 Class 'mysqli' not found
Mac上跑CodeIgniter时突然报这个错,不是框架问题,是PHP本身缺扩展。macOS自带的PHP早被弃用,Homebrew装的PHP默认也不开常用扩展。得手动确认并启用mysqli、pdo_mysql、mbstring这几个——CodeIgniter 3.x/4.x 都强依赖它们。
- 先运行
php -m | grep -E 'mysqli|pdo|mbstring',看有没有输出;没输出说明没加载 - 查当前PHP配置文件位置:
php --ini,重点看 Loaded Configuration File 行 - 打开那个
php.ini,取消注释(删掉分号):extension=mysqli、extension=pdo_mysql、extension=mbstring - Mac上用Homebrew装PHP(比如
php@8.2),扩展文件在/opt/homebrew/lib/php/pecl/或/usr/local/lib/php/pecl/,确保extension_dir指向对的位置 - 改完重启Web服务:
brew services restart php@8.2(如果用的是Apache,要sudo apachectl restart)
CodeIgniter 4启动时报 Call to undefined function CodeIgniter\Utils\password_hash()
这是PHP缺少password_hash函数导致的,本质是hash扩展未启用。CI4在Session、Auth等模块里直接调这个函数,不兼容“关了hash扩展”的PHP安装。
- 运行
php -m | grep hash,没结果就进php.ini加一行:extension=hash - 注意:有些老版本Homebrew PHP包(如
php@7.4)默认不编译hash,得重装:brew reinstall php@7.4 --with-hash(但新版已不支持该参数,更稳妥是升级到php@8.1+) - CI4要求PHP ≥ 7.4,但Mac上用太旧的PHP容易连锁缺失扩展,建议直接切到
php@8.2或php@8.3 - 验证是否生效:
php -r "echo function_exists('password_hash') ? 'ok' : 'fail';"
本地开发时CI4的.env读不到database.default.hostname
不是.env语法写错了,大概率是PHP的parse_ini_file()函数被禁用,或者opcache.enable导致缓存了旧配置。CI4靠这个函数加载.env,而Mac上某些PHP安装默认禁用它。
- 检查
php.ini里有没有disable_functions = parse_ini_file,有就删掉这一行 - 运行
php -i | grep opcache,如果opcache.enable => On且opcache.revalidate_freq => 0没设,.env改了不会立刻生效;临时加一句:opcache.revalidate_freq=1 - 确保
.env文件权限是644,且不在~/或/tmp这种可能被PHP open_basedir限制的路径下 - CI4默认只在
APPPATH . '.env'找,别放在public目录或根目录下乱放
用Valet或Laravel Valet跑CI项目,路由404但index.php能访问
Valet默认按Laravel规则配rewrite,CI的URL路由不走index.php就会挂。这不是CodeIgniter配置问题,是Nginx/Apache的重写规则没对上CI的mod_rewrite预期。
立即学习“PHP免费学习笔记(深入)”;
- Valet用户:运行
valet park前,在项目根目录加一个valet.conf,内容写:location / { try_files $uri $uri/ /index.php?$query_string; } - Apache用户:确认
.htaccess存在且内容含RewriteRule ^(.*)$ index.php/$1 [L],同时AllowOverride All在虚拟主机配置里开了 - Mac上用系统Apache时,
httpd.conf里LoadModule rewrite_module libexec/apache2/mod_rewrite.so这行必须取消注释 - CI4的
$config['index_page'] = ''和$config['uri_protocol'] = 'REQUEST_URI'这两项必须设对,否则即使rewrite通了也取不到路由段
which php和Apache用的不是同一个PHP、甚至Terminal里php -v显示8.2但Valet偷偷用了8.1。配之前先统一确认PHP来源,比反复改php.ini更省时间。











