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
相关产品推荐
相关产品推荐

