PHP报错Call to undefined function解决
前言
运行PHP代码,突然报错:"Call to undefined function xxx()"?这个错太常见了,一般就是扩展没装或者文件没引入。本文讲怎么排查和解决。
一、报错长啥样
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in xxx.php on line 5
意思:你调用了一个不存在的函数。
二、常见原因
原因1:PHP扩展没装
比如用了 mysqli_connect(),但没装mysqli扩展。
或者用了 gd库 的函数,但没装gd。
原因2:文件没引入
你自己写的函数,忘了include/require文件。
原因3:函数名写错了
拼写错了,比如 str_lower 写成 strlower。
原因4:PHP版本不对
低版本PHP没有高版本才有的函数。
三、排查步骤
第一步:看是哪个函数报错
报错信息里会告诉你函数名:
Call to undefined function curl_init()
这里就是 curl_init() 函数没找到。
第二步:判断是内置函数还是自己写的
- 内置函数:PHP自带的,比如
curl_init、mysqli_connect - 自己写的:你在别的文件里定义的
第三步:如果是内置函数,查扩展装了没
php -m | grep curl
看看curl扩展装了没。
或者写个phpinfo:
<?php
phpinfo();
?>
搜这个函数名对应的扩展,看有没有。
四、安装扩展
例子1:装curl扩展
# CentOS
yum install php-curl
# Ubuntu
apt install php-curl
例子2:装mysqli扩展
yum install php-mysqli
例子3:装gd库
yum install php-gd
装完重启
systemctl restart php-fpm
五、如果是自己写的函数
检查文件引入
<?php
// 引入函数文件
require 'functions.php';
// 调用
my_function();
检查函数名对不对
// functions.php里定义的
function my_function() {
// ...
}
调用的时候名字要一模一样。
检查命名空间
如果用了命名空间,要注意:
<?php
namespace App;
// 调用别的命名空间的函数
\OtherNamespace\my_function();
六、常见函数和对应扩展
| 函数 | 需要的扩展 |
|---|---|
| mysqli_connect | mysqli |
| curl_init | curl |
| imagecreate | gd |
| mb_strlen | mbstring |
| openssl_encrypt | openssl |
| pdo连接 | pdo_mysql |
| json_encode | json(默认有) |
| file_get_contents | 不需要(默认有) |
七、常见坑
坑1:mysql函数被废弃了
PHP7以后,mysql_* 函数都没了,要用mysqli或者PDO。
Call to undefined function mysql_connect()
解决: 换成mysqli或者PDO。
坑2:CLI和FPM装的扩展不一样
命令行里装了,网页上没有。
原因: CLI和FPM用不同的php.ini。
解决: 看phpinfo里的配置,装到对应的PHP版本里。
坑3:装了扩展没重启
装完忘了重启php-fpm。
解决:
systemctl restart php-fpm
坑4:函数名大小写
PHP函数名不区分大小写,但自己写的类方法区分。
坑5:Composer自动加载没生效
用了Composer的库,但没 vendor/autoload.php。
require 'vendor/autoload.php';
八、快速排查
第一步:看报错的函数名
Call to undefined function xxx()
第二步:查扩展
php -m | grep 扩展名
第三步:没装就装
yum install php-扩展名
第四步:重启
systemctl restart php-fpm
九、常用扩展安装
一次性装常用扩展
yum install php-mysqli php-curl php-gd php-mbstring php-xml php-json
Ubuntu
apt install php-mysqli php-curl php-gd php-mbstring php-xml
总结
记住:
- 报错会告诉你是哪个函数没找到
- 内置函数就查扩展装了没
- 自己写的就查文件引入了没
- 装完扩展要重启php-fpm
- mysql_* 函数PHP7没了,换mysqli
排查流程:
看报错函数名 → 判断是内置还是自己写的 → 内置查扩展 → 自己写的查引入 → 解决
遇到问题加QQ23979811 协助处理