为什么 laravel 在创建或上传文件或文件夹后需要 chmod()?

why laravel needs to chmod() a file or folder after being created or uploaded?

最近,我使用 Apache、PHP-FPM 和 MariaDB 部署了一个 Web 服务器配置。 运行 很顺利,直到我的同事在上面部署了 laravel 4 具有图片上传功能的应用程序。

问题是我禁用了 PHP 的 chmod() 功能以及 system() 等功能,而上传图片的脚本使用 chmod()umask()(我的同事说这是默认行为)。

我知道有一个关于 chmod 和 PHP 的危险的争论,就像 this site that tells it is harmless, and this post 告诉服务器永远不应该是 777

我不明白的是,为什么 chmod() 进程即使没有 chmod() 也可以正确读取上传的文件?它甚至可以在没有 chmod() 的情况下创建文件夹和删除文件夹,因为这些文件和文件夹是在 PHP 进程的正确权限下创建的。

tl;dr
所以我的问题是,laravel 4 中的文件上传是否需要 chmod() 才能正常运行?为什么?

编辑
对于那些想知道代码的人(此代码在 vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php 中找到):

$target = $this->getTargetFile($directory, $name);

if (!@move_uploaded_file($this->getPathname(), $target)) {
    $error = error_get_last();
    throw new FileException(sprintf('Could not move file "%s" to "%s" (%S)', $this->getPathname(), $target, strip_tags($error['message'])));
}

@chmod($target, 0666 & ~umask());

我不能代表 Laravel 背后的推理。看起来它确实内置于他们的功能中,但对此进行快速搜索会在 http://php.net/manual/en/function.move-uploaded-file.php.

下显示评论

评论说用move_uploaded_file移动上传的文件后,权限设置为0600。如果web服务器和PHP进程在运行下就好了相同的所需用户,但如果它依赖于像 apachenobody 这样的通用用户下的组或网络服务器 运行,则不是。所以我的假设是 Laravel 这样做是为了与后一个系统兼容,因为 0600 意味着用户可以读取并且无法访问组或其他人。