我有 nginx+php-fpm,我需要从 php-script 递归删除文件夹:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
$out = shell_exec('/bin/rm -vrf /data/vmail/test');
var_dump($out);
$out 为 NULL,但在 error.log 中我收到
WARNING: [pool www] child 7210 said into stderr: "rm: "
WARNING: [pool www] child 7210 said into stderr: "cannot remove `/data/vmail/test'"
WARNING: [pool www] child 7210 said into stderr: ": Permission denied"
- PHP-FPM 在用户“nginx”下运行
- NGINX 在用户“nginx”下运行
- /data/vmail 和所有子文件夹都归 vmail:vmail (chmod 770) 所有
存在补充组:
# groups nginx
nginx : nginx vmail
# groups vmail
vmail : vmail nginx
解决方案
- 如果我 chown
/data/vmail/test
到 nginx:nginx 它的内容将变为可删除。但/data/vmail/test
仍然不是,只要/data/vmail
属于 vmail:vmail 我想。 - 如果我
chmod -R 777 /data/vmail/test && chmod 777 /data/vmail
意味着文件夹变得可删除。 - PHP 函数
rmdir()
有效(不知道为什么)!但是大文件夹的递归删除太耗费资源了
我不认为这些选项是一种解决方案。此外,我不考虑涉及 root 用户和/etc/sudoers
/或以 root 身份运行 php-fpm 的解决方案。那么......如何才能让 /bin/rm 工作?