You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中sys_get_temp_dir()在Valet请求与Horizon队列返回路径不一致

异常问题:sys_get_temp_dir()在Action类与Horizon队列任务中返回不同路径

我有一个服务类会在队列任务中被调用,该队列任务由一个Action类链式分发。在Action类中,sys_get_temp_dir()返回路径为/var/tmp;但在Horizon处理的队列任务中,sys_get_temp_dir()返回的路径却是/var/folders/7s/jq24sk81665c1j4y3v9l3vth0000gn/T。

相关代码示例:

public function doSomething(array $command)
{
    ray(sys_get_temp_dir())->label('methodCall');
}

该代码在队列任务中返回/var/folders/7s/jq24sk81665c1j4y3v9l3vth0000gn/T。奇怪的是,该问题仅在使用Horizon队列时出现,PestPHP测试或Tinker手动测试均无法复现。

排查尝试

1. 检查PHP版本差异

查看Horizon的常驻进程,发现其使用的PHP版本为8.3.0:

ahoi             56472   0.0  0.2 410189312  81696 s002  S+    9:20AM   0:00.71 /opt/homebrew/Cellar/php/8.3.0/bin/php artisan horizon:work redis --name=default --supervisor=macbook-pro-IFR4:supervisor-1 --backoff=0 --max-time=0 --max-jobs=0 --memory=128 --queue=provisioning --sleep=3 --timeout=60 --tries=1 --rest=0
ahoi             56468   0.0  0.1 409899840  54432 s002  S+    9:20AM   0:00.27 /opt/homebrew/Cellar/php/8.3.0/bin/php artisan horizon:work redis --name=default --supervisor=macbook-pro-IFR4:supervisor-1 --backoff=0 --max-time=0 --max-jobs=0 --memory=128 --queue=deploying --sleep=3 --timeout=60 --tries=1 --rest=0
ahoi             56464   0.0  0.1 409645888  54064 s002  S+    9:20AM   0:00.26 /opt/homebrew/Cellar/php/8.3.0/bin/php artisan horizon:work redis --name=default --supervisor=macbook-pro-IFR4:supervisor-1 --backoff=0 --max-time=0 --max-jobs=0 --memory=128 --queue=building --sleep=3 --timeout=60 --tries=1 --rest=0
ahoi             56460   0.0  0.1 409629504  53872 s002  S+    9:20AM   0:00.26 /opt/homebrew/Cellar/php/8.3.0/bin/php artisan horizon:work redis --name=default --supervisor=macbook-pro-IFR4:supervisor-1 --backoff=0 --max-time=0 --max-jobs=0 --memory=128 --queue=default --sleep=3 --timeout=60 --tries=1 --rest=0
ahoi             56433   0.0  0.1 408944448  52160 s002  S+    9:20AM   0:00.47 /opt/homebrew/Cellar/php/8.3.0/bin/php artisan horizon:supervisor macbook-pro-IFR4:supervisor-1 redis --workers-name=default --balance=auto --max-processes=20 --min-processes=1 --nice=0 --balance-cooldown=3 --balance-max-shift=1 --parent-id=56417 --auto-scaling-strategy=time --backoff=0 --max-time=0 --max-jobs=0 --memory=128 --queue=default,building,deploying,provisioning --sleep=3 --timeout=60 --tries=1 --rest=0

而本地CLI模式使用的PHP版本为8.3.1:

which php
/opt/homebrew/bin/php

ls -lah /opt/homebrew/bin/php
lrwxr-xr-x  1 ahoi  admin    27B Dec 22 12:51 /opt/homebrew/bin/php -> ../Cellar/php/8.3.1/bin/php

但单独测试两个版本的sys_get_temp_dir(),返回的都是/var/folders/7s/jq24sk81665c1j4y3v9l3vth0000gn/T:

/opt/homebrew/Cellar/php/8.3.0/bin/php -r 'echo sys_get_temp_dir();'
/var/folders/7s/jq24sk81665c1j4y3v9l3vth0000gn/T%      

php -r 'echo sys_get_temp_dir();'
/var/folders/7s/jq24sk81665c1j4y3v9l3vth0000gn/T%  

2. 检查TMPDIR环境变量

在返回/var/tmp的Action类中,getenv('TMPDIR')返回false;而Horizon处理的队列任务中,该变量返回正确的临时目录路径。

3. 复现场景验证

进一步排查发现,问题仅在通过Laravel Valet处理HTTP请求时出现,使用Laravel内置Web服务器则无此问题。


内容的提问来源于stack exchange,提问作者SPQRInc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:01:24