php调用文生图api失败主因是环境变量未正确加载:cli与web(apache/nginx+php-fpm)环境变量机制不同,.env需用vlucas/phpdotenv显式加载,web服务器须配置setenv或fastcgi_param传递变量。

PHP项目里调用文生图API失败,八成是环境变量没生效,不是代码写错了。
为什么FAL_KEY设了却读不到
PHP CLI 和 Web 服务器(如 Apache/Nginx + PHP-FPM)加载环境变量的机制完全不同。你在 shell 里 export FAL_KEY=sk-fal-xxx,CLI 脚本能读到,但 Web 请求根本看不见这个变量。
- CLI 场景:直接运行
php generate.php,环境变量从当前终端继承 - Web 场景:PHP-FPM 进程由 systemd 或 init 启动,不读用户 shell 的
.bashrc或.zshrc - 常见误操作:把
putenv("FAL_KEY=...")写在工具函数里——它只对当前请求生效,且容易被后续putenv覆盖
.env 文件不能靠 $_ENV 自动加载
PHP 默认不会解析 .env 文件,$_ENV 是空的,除非你显式引入 dotenv 库并调用 Dotenv\Dotenv::createImmutable()。
- 别依赖
getenv("FAL_KEY")直接返回值——它在大多数 Web 配置下返回false - 正确做法:用
vlucas/phpdotenv,并在入口文件(如index.php或工具初始化处)顶部加载:use Dotenv\Dotenv; $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->load();
- 验证是否生效:加一行
var_dump($_SERVER['FAL_KEY'] ?? 'not set');,必须看到密钥才继续
Apache 和 Nginx 下环境变量传递差异
即使用了 dotenv,Web 服务本身也可能拦截或覆盖变量。尤其当 PHP 以模块方式运行时,$_SERVER 和 $_ENV 行为不一致。
- Apache:需在
.htaccess或虚拟主机配置中显式传入,例如:SetEnv FAL_KEY "sk-fal-xxx"
- Nginx + PHP-FPM:必须在
fastcgi_param中声明,不能只靠env指令:fastcgi_param FAL_KEY "sk-fal-xxx";
- 最稳妥方案:跳过 Web 服务器层,在 PHP 里硬编码 fallback(仅限开发环境):
$key = $_SERVER['FAL_KEY'] ?? ($_ENV['FAL_KEY'] ?? getenv('FAL_KEY') ?: 'sk-fal-dev-local');
环境变量问题最难调试的地方在于:它看起来“有时行、有时不行”,本质是执行上下文切换导致的变量隔离。别猜,先确认 phpinfo() 页面里 FAL_KEY 是否出现在 $_SERVER 区域——没出现,就说明还没进 PHP 运行时,得回 Web 服务器配置里找。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











