PHP调用yaml_emit_file报错:未定义函数的解决方法咨询
解决Call to undefined function yaml_emit_file()的问题
看起来你遇到的核心问题是PHP的YAML扩展没有正确加载,导致找不到yaml_emit_file()函数。下面是一步步的排查和解决方法:
1. 先确认YAML扩展是否真的安装并加载成功
很多时候我们以为配置了扩展,但实际并没有生效,先做个验证:
- 创建一个PHP文件,内容写
<?php phpinfo(); ?>,访问后搜索yaml关键字,如果看不到yaml模块的相关信息,说明扩展根本没加载。 - 或者在命令行执行:
php -m,查看输出列表里有没有yaml;也可以用php -i | grep -i yaml,快速筛选yaml相关配置。
如果没找到yaml模块,说明你的extension配置没生效,或者扩展本身没正确安装。
2. 检查你修改的php.ini是不是当前PHP在用的
这是最容易踩坑的点:
- MAMP环境:MAMP自带多个PHP版本,每个版本都有独立的php.ini文件,路径大概是
/Applications/MAMP/bin/php/php[你的PHP版本号]/conf/php.ini(比如php8.1.0对应的路径),别修改系统默认的php.ini,要改MAMP对应版本的那个。 - 线上服务器:通过
phpinfo()里的Loaded Configuration File项,能看到当前PHP进程使用的php.ini绝对路径,只有修改这个文件才有用。
3. 正确安装YAML扩展
不要随便找个yaml.so就往php.ini里加,建议用官方推荐的方式安装:
针对Linux服务器
- Debian/Ubuntu系统:执行
sudo apt-get install php-yaml(注意对应你的PHP版本,比如PHP7.4要装php7.4-yaml) - CentOS/RHEL系统:执行
sudo yum install php-pecl-yaml,或者用pecl安装:pecl install yaml
针对MAMP(Mac)
- 可以用Homebrew安装对应PHP版本的yaml扩展:比如
brew install php@8.1-yaml,然后把生成的yaml.so绝对路径添加到MAMP的php.ini里,比如extension="/usr/local/opt/php@8.1/pecl/20210902/yaml.so"
4. 旧版本扩展的兼容方案
如果你的YAML扩展版本低于1.1.0,可能没有yaml_emit_file()函数,这时候可以自己实现相同功能:
try { $array = array('firstname' => 'Ray', 'lastname' => 'Zah'); // 先生成YAML格式字符串 $yamlContent = yaml_emit($array); // 再写入目标文件 file_put_contents('../../config.yml', $yamlContent); echo "done!\n"; } catch (Exception $e) { echo 'Exception: ', $e->getMessage(), "\n"; }
5. 最后别忘了重启服务器
不管是修改了php.ini还是刚装完扩展,都要重启你的Web服务器(MAMP的Apache/Nginx,线上的Apache/Nginx/php-fpm),配置才能生效。
内容的提问来源于stack exchange,提问作者Reza Saadati
相关产品推荐
相关产品推荐

