Laravel 5.2 无法打开 laravel.log

14

我知道这个话题已经有很多问题了,但我的问题非常奇怪,所以我决定发帖求助。 在/var/logs/apache/error.log中出现了这个错误。

  [Tue Mar 01 07:26:51.435312 2016] [:error] [pid 8837] [client 127.0.0.1:37843] PHP Fatal error:  Uncaught exception 'UnexpectedValueException' with message 'The stream or file "/var/www/personale/librarie-cor/storage/logs/laravel.log" could not be opened: 
failed to open stream: Permission denied' in /var/www/personale/librarie-cor/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:87\nStack trace:
\n#0 /var/www/personale/librarie-cor/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37): Monolog\\Handler\\StreamHandler->write(Array)
\n#1 /var/www/personale/librarie-cor/vendor/monolog/monolog/src/Monolog/Logger.php(289): Monolog\\Handler\\AbstractProcessingHandler->handle(Array)
\n#2 /var/www/personale/librarie-cor/vendor/monolog/monolog/src/Monolog/Logger.php(565): Monolog\\Logger->addRecord(400, Object(Symfony\\Component\\Debug\\Exception\\FatalErrorException), Array)
\n#3 /var/www/personale/librarie-cor/vendor/laravel/framework/src/Illuminate/Log/Writer.php(202): Monolog\\Logger->error(Object(Symfony\\Component\\Debug\\Exception\\FatalErrorException), Array)
\n#4 /var/www/personale/librarie-cor in /var/www/personale/librarie-cor/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php on line 87

问题是我已经执行了chmod -R 777 storage/,这是一张屏幕截图:

chmoded

我该如何消除错误?


仅更新一次Composer。 - sandeepsure
已经尝试过了,但没有运气。 - Daniel Bejan
删除 laravel.log 文件。然后 Laravel 将会生成一个新的文件。 - naneri
尝试过了,那也不起作用……我发布了一个解决方案。 - Daniel Bejan
为什么数据库文件夹要设置为777? - NineCattoRules
6个回答

46

简短概述:

在您的终端上运行以下命令

# Clear Laravel cache and the compiled classes
php artisan cache:clear
php artisan clear-compiled

# Change the storage and cache directories permission
sudo chmod -R 777 storage
sudo chmod -R 777 bootstrap/cache

# Regenerate the composer autoload file
composer dump-autoload

更详细的解释

通常情况下,这是因为Web服务器需要对storagebootstrap/cache目录具有写访问权限。

1. 检查Web服务器进程使用的用户

首先确保您的Web服务器进程是由一个带有受限权限的帐户运行的。 Nginx和Apache通常会自动创建并使用权限较低的www-data用户和组。您可以始终使用ps命令检查正在运行的服务使用哪个用户:

ps aux | grep nginx

2. 设置项目目录的所有者

接下来,请确保你的 Laravel 项目目录的所有者和运行 Web 服务器进程的用户和组相同。假设你的 Web 服务器由 www-data 运行,而你的项目目录位于 /var/www/laravel,你可以像这样设置所有权:

sudo chown -R www-data:www-data /var/www/laravel

3. 给storagecache目录授予写入权限

这是重要的一步,确保您同时将写入权限授予storagebootstrap/cache目录。

sudo chmod -R 775 /var/www/laravel/storage
sudo chmod -R 775 /var/www/laravel/bootstrap/cache

仍然无法解决?

如果上述步骤仍然无法解决问题,您可以尝试在shell中运行以下命令:

# 1. Clear Laravel cache
php artisan cache:clear

# 2. Delete the compiled class
php artisan clear-compiled

# 3. Regenerate the composer autoload file
composer dump-autoload

还是不起作用吗?

对于最后一项资源,请尝试将权限设置为777,这意味着任何用户都可以读取和写入给定目录。

sudo chmod -R 777 /var/www/laravel/storage
sudo chmod -R 777 /var/www/laravel/bootstrap/cache

希望这能帮到您。


我已经更新了我的回答。我刚刚意识到你正在使用Laravel 5.2版本。 - Risan Bagja Pradana
我遇到了这个问题,因为我在生产环境中运行了composer update。sudo chmod -R 777 storage对我有用,但我不知道为什么。有人能解释一下吗? - Dazzle
@Dazzle,这是因为Web服务器/Laravel需要对这两个目录进行写访问(用于写入日志和缓存)。不一定总是777,这取决于这两个目录的所有者/组。您可以在此处找到简短的说明:Laravel配置 - Risan Bagja Pradana
1
谢谢,@NineCattoRules!我刚刚添加了一些关于安全方面的信息。 - Risan Bagja Pradana

11

我在Centos7上也遇到了同样的问题... 尝试了一切方法。最后,在stackoverflow上发现了一篇帖子,建议可能是selinux的原因。我禁用了selinux,问题得到了解决!


是的,但不知道为什么。 - Lynn
找到了一个链接,其中更详细地描述了SElinux问题:https://dev59.com/GV0a5IYBdhLWcg3wdIfo - Alex

6
如果您使用的是CentOS,则需要禁用SELinux执行。请运行以下命令进行操作。
setenforce 0

在我的情况下,这个解决方案非常有效。希望这能帮到你。

那么安全风险呢? - NineCattoRules
查看 https://laracasts.com/discuss/channels/laravel/laravel5-gives-blank-page-with-500-status-code-on-apache-fedora22/replies/98874 - NineCattoRules
以上问题的最佳解决方案是 **chcon -R -t httpd_sys_rw_content_t storage**。 - Muhammad Usama

5

您应该尝试一些类似于这样的事情——

php artisan cache:clear
php artisan clear-compiled

sudo chmod -R 777 storage/ -R
composer dump-autoload

您可以查看这个问题了解更多细节。该问题与Linux Ubuntu下设置文件夹及其所有子文件夹和文件的chmod相关。

已经尝试过了,没有效果。请检查我的答案,看看我找到的解决方案是否正确。 - Daniel Bejan

2

我终于找到了解决方案...看起来问题与PSR-4和自动导入类有关

所以这是解决方案,供其他遇到同样问题的人参考:

php artisan clear-compiled 
composer dump-autoload
php artisan optimize
php artisan cache:clear

2
请使用以下命令:

chcon -R -t httpd_sys_rw_content_t storage

这个命令可以为存储目录添加httpd_sys_rw_content_t标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接