执行Rector命令时遭遇/tmp目录权限拒绝错误求助
解决Rector运行时/tmp目录权限拒绝问题
问题描述
执行命令:
vendor/bin/rector process --dry-run
出现错误:
[ERROR] Failed to create "/tmp/rector_cached_files/26": mkdir(): Permission denied
环境背景:
- Web服务器进程以普通用户身份运行,root身份可正常执行,但必须以普通用户运行
- 同服务器另一域名使用完全相同配置可正常运行,新建域名重复配置后问题依旧
- 已切换PHP 7.4/8.0/8.1版本,当前为Apache + PHP 8.1(ea-php81)PHP-FPM
当前rector.php配置:
<?php declare(strict_types=1); use Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector; use Rector\Config\RectorConfig; use Rector\Set\ValueObject\SetList; use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromStrictConstructorRector; use Rector\Set\ValueObject\LevelSetList; use Rector\Core\ValueObject\PhpVersion; return static function (RectorConfig $rectorConfig): void { $rectorConfig->skip([ __DIR__ . '/assets', __DIR__ . '/blocks', __DIR__ . '/install', __DIR__ . '/modules/Forums', __DIR__ . '/modules/Advertising', __DIR__ . '/modules/Arcade_Tweaks', __DIR__ . '/modules/Blog_Submit', __DIR__ . '/modules/Blog_Topics', __DIR__ . '/modules/Blogs', __DIR__ . '/modules/Blogs_Top', __DIR__ . '/modules/Bookmarks', __DIR__ . '/modules/Cemetery', __DIR__ . '/modules/cPanel_Login', __DIR__ . '/modules/CSS_Color_Chart', __DIR__ . '/modules/CSS_Reference', __DIR__ . '/modules/Docs', __DIR__ . '/modules/Donations', __DIR__ . '/modules/ECalendar', __DIR__ . '/modules/Evo_UserBlock', __DIR__ . '/modules/FAQ', __DIR__ . '/modules/Feedback', __DIR__ . '/modules/File_Repository', __DIR__ . '/modules/Google-Site-Map', __DIR__ . '/modules/Groups', __DIR__ . '/modules/HTML_Newsletter', __DIR__ . '/modules/HTML_to_PHP', __DIR__ . '/modules/Image_Repository', __DIR__ . '/modules/Link_Us', __DIR__ . '/modules/Loan_Amortization', __DIR__ . '/modules/Member_List', __DIR__ . '/modules/My_Forum_Topics', __DIR__ . '/modules/Network', __DIR__ . '/modules/Network_Advertising', __DIR__ . '/modules/Network_Projects', __DIR__ . '/modules/NukeSentinel', __DIR__ . '/modules/Private_Messages', __DIR__ . '/modules/Profile', __DIR__ . '/modules/Proof_Of_God', __DIR__ . '/modules/Recommend_Us', __DIR__ . '/modules/Reviews', __DIR__ . '/modules/Search', __DIR__ . '/modules/Shout_Box', __DIR__ . '/modules/Spambot_Killer', __DIR__ . '/modules/Statistics', __DIR__ . '/modules/Surveys', __DIR__ . '/modules/Titanium_SandBox', __DIR__ . '/modules/Web_Links', __DIR__ . '/modules/Your_Account', __DIR__ . '/admin', __DIR__ . '/themes', __DIR__ . '/dev_modules', __DIR__ . '/cgi-bin', __DIR__ . '/.well-known', __DIR__ . '/vendor', ]); $rectorConfig->paths([ __DIR__ . '/includes/classes/class.identify.php', ]); $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class); $rectorConfig->phpVersion(PhpVersion::PHP_81); $rectorConfig->sets([ LevelSetList::UP_TO_PHP_81, SetList::CODE_QUALITY, ]); }; ?>
解决方案
1. 清理/tmp下的旧缓存目录
如果之前用root运行过Rector,/tmp/rector_cached_files目录可能属于root,导致普通用户无法写入。执行以下命令删除该目录:
sudo rm -rf /tmp/rector_cached_files
之后用普通用户重新运行Rector命令,让其自行创建权限正确的缓存目录。
2. 为Rector指定项目内的自定义缓存目录
修改rector.php配置,添加自定义缓存目录(放在项目根目录下,确保普通用户有读写权限):
return static function (RectorConfig $rectorConfig): void { // 其他配置保持不变 $rectorConfig->cacheDirectory(__DIR__ . '/.rector_cache'); };
然后创建该目录并设置权限:
mkdir .rector_cache chown your-web-user:your-web-group .rector_cache # 替换成你的Web进程用户和组 chmod 755 .rector_cache
3. 检查系统/tmp目录权限
确保系统/tmp目录权限为1777(sticky位,允许所有用户写入但只能删除自己的文件):
ls -ld /tmp
如果权限不对,执行:
sudo chmod 1777 /tmp
4. 检查PHP-FPM的open_basedir限制
查看PHP-FPM的域名配置文件(通常位于/etc/php/8.1/fpm/pool.d/[your-domain].conf),检查是否有open_basedir设置。如果存在,确保/tmp或自定义的.rector_cache目录在允许的路径列表中:
php_admin_value[open_basedir] = /path/to/your/project:/tmp:/path/to/.rector_cache
修改后重启PHP-FPM服务:
sudo systemctl restart php-fpm
内容的提问来源于stack exchange,提问作者Ernest Allen Buffington
相关产品推荐
相关产品推荐

