2

我有 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 工作?

附加信息 ##

4

1 回答 1

1

删除目录的内容是对目录的写操作。所以运行 PHP 的用户需要对 /data/vmail 有写权限。

于 2013-10-05T16:34:49.737 回答