【发布时间】:2012-02-19 19:19:54
【问题描述】:
我有以下简单的脚本来测试 PHP 中的 mkdir() 函数:
<?php
$id = rand();
$targetPath = $_SERVER['DOCUMENT_ROOT'] . '/sample_folder/' . $id .'/';
mkdir(str_replace('//','/',$targetPath), 0755, true);
?>
理想情况下,每次脚本在我的 web 目录/sample_folder 下运行时,这都会创建一个随机文件夹。 Sample_folder 有 755 个权限。
我面临的问题是,我一直遇到 PHP:mkdir() Permission denied 问题。我的 sample_folder 权限当前设置为 chmod 755。
一切我已经阅读了不将 chmod 更改为 777 的状态,所以请不要建议。
出于测试目的,chmod 777 'sample_folder' 目录解决了这个问题,但这又会带来安全问题。关于如何完成这项工作,我还有什么遗漏吗?
注意:我系统上的PHP用户是“apache”;
我在 Media Temple 专用虚拟服务器上运行 PHP 5.3.* 和 CentOS 5.5 以供参考。我还查看了几乎所有关于 SO 的 chmod 问题,似乎找不到与我的问题相匹配的解决方案(777 条建议除外)。
编辑
在我的服务器上运行 ls -la 会返回:
drwxr-xr-x 2 ftphiddenname psacln 4096 Jan 26 11:24 sample_folder
最终更新
提供的答案非常有帮助。对于任何寻找更多信息的人,我看到了这篇知识库文章,虽然它在 Media Temple 上列出,但我相信这些原则适用于任何最相似的配置:
【问题讨论】:
-
而不是
chmoding,您需要chown以确保755足以让您修改相关目录。您需要父目录上的7(6?) 才能执行此操作 - 因此,如果父目录不属于 PHP 正在执行的用户,它不会让您使用755. -
@DaveRandom - 感谢您的注意。老实说,我对 php 相当精通,但有时在使用 linux 服务器时遇到一些麻烦。如果需要,是否有特定的命令来查找此信息和地址?顺便说一句,我的 php 用户是“apache”。
-
如果您在父目录的父目录中
ls -l,您可以看到父目录的权限和所有权(如果您遵循这一点,如果您没有这样做,我会原谅您)。本质上,在您的示例中,您应该ls -l文档根目录,您将看到您想要的信息。你真正需要做的(作为一个有权限的用户)就是chown apache <document root>/sample_folder -
@DaveRandom - 非常感谢。文件夹上的 chown 命令正是需要的。我将发布一个指向我刚刚找到的特定知识库文章的链接,但有没有办法在未来防止这种情况发生,或者在一次性情况下总是需要修复?
-
该文件夹将被分配到创建用户的所有权 - 查看您在上面发布的输出,我猜您是通过 FTP 创建的,每次执行此操作都会有这个问题。为避免这种情况,您需要将目录创建为
apache用户(使用 PHP 创建的任何东西都应该这样做),或者在创建目录时将它们chown设置为apache。
标签: php apache permissions chmod mkdir