新的Codeigniter 4项目获得错误" CodeIgniter\Cache\Exceptions\CacheException Cache unable to write to ..."

回答 3 浏览 1230 2022-08-30

几乎所有的时候,当我开始一个Codeigniter 4项目的时候,我都会遇到以下的错误。

"CodeIgniter\Cache\Exceptions\CacheException Cache unable to write to "/path/to/codeigniter-project/writable/cache/."

SYSTEMPATH/Cache/Handlers/FileHandler.php at line 61

指向下一行:

throw CacheException::forUnableToWrite($this->path);

Cache Exception

解决这个问题的最好方法是什么?

John Skoumbourdis 提问于2022-08-30
3 个回答
#1楼 已采纳
得票数 2

在做了研究之后,我总结出两个选项

选项1:解决上述问题的非常快速的方法是进入命令工具(例如终端),将文件夹的权限改为可写,同时将文件夹的所有者改为你的服务器应用程序中使用的所有者。例如,我使用的是Apache,apache的用户是www-data

chmod -R 755 writable/ 
chown -R www-data:www-data writable/

或适用于macOS。

chmod -R 755 writable/ 
chown -R _www:_www writable/

优点是:

  • 一个快速复制粘贴的解决方案
  • 这些命令--大多数时候--都是开箱即用
  • 即使你没有访问命令工具的权限,你也可以通过FTP改变文件夹的权限和所有权(例如通过FileZilla UI界面)。

弊端:

  • 你总是需要将这些命令添加到一个新的项目中去
  • 当你试图用你的用户名访问文件夹时,你可能会在开发上遇到问题。

选项2(建议用于本地开发):添加www-data_www(用于macOS),使其与你的用户处于相同的组别角色。

适用于Linux和Apache。

sudo usermod -aG www-data your_username

或适用于macOS和Apache。

sudo dseditgroup -o edit -a your_username -t user _www

如果你仍然得到这个错误,也要确保你的文件夹是可写的,用下面的命令。

chmod -R 755 writable/ 

我不知道为什么,但它可能也需要对Apache进行重新启动。

优点是。

  • 它适用于新项目,无需额外努力
  • 你不需要改变文件夹的所有者,这样你就可以有权限访问该文件夹进行开发
  • 一旦这个变化对服务器或本地可用,如果需要使用chmod命令,你就不需要再使用sudo命令了

弊端:

  • 对于生产环境来说并不安全(尤其是当你不知道自己在做什么的时候),因为你更愿意让特定的用户拥有特定的角色,而不是让用户在任何地方都有权限。
  • 这需要更多的努力,而且对初学者来说也不是那么简单的事情。
  • 它需要对服务器有更多的权限(如sudo权限)。
John Skoumbourdis 提问于2022-08-30
John Skoumbourdis 修改于2022-10-11
我不知道是谁提出了方案2,但我会非常小心地对待这个方案。parttimeturtle 2022-08-31
linux命令的参考资料。askubuntu.com/a/867170/173256serverfault.com/a/381707/407191 macOS命令的参考资料。stackoverflow.com/a/5784745/2282575John Skoumbourdis 2022-09-01
危险的是,如果你把httpd用户和一个拥有超越httpd用户权限的用户组合在一起;大多数为实际的人类用户准备的账户都会属于这个类别,如果你以root身份运行,上帝会帮助你。我认为,从 "最小权限 "的角度来看,选项1是更安全的选择。parttimeturtle 2022-09-01
很公平:).我将在回复中更新[建议当地发展],并在弊端处提出意见。谢谢你John Skoumbourdis 2022-09-02
如果有谁在Ubuntu 22.04的本地环境中使用Xampp,你可以通过运行ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'命令来检查Apache用户。然后你需要像上面OP指定的那样用chown赋予该用户必要的权限,例如,在我的系统上是chown -R daemon:daemon folder_name/kimetsu no yaiba 2022-11-22
#2楼
得票数 1

OP有一个好的答案。尽管有时你无法访问终端或安全的外壳(ssh,特别是在共享主机环境中能够运行这些命令。

我在做一个新项目的时候也遇到了类似的问题。我注意到,这通常是因为我的应用程序由于权限限制而无法在我的项目根目录的writable/session文件夹中写入会话文件。我在使用CodeIgniter\Session\Handlers\FileHandler作为我配置的"会话存储驱动器"

我通过指示应用程序将这些临时文件写入服务器的tmp目录,成功地解决了这个问题。

这是默认的,在/tmp目录下。

摘自php-src/php.ini-production的内容

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
;sys_temp_dir = "/tmp"

解决方案

我打开了我的.env文件,该文件位于我的项目目录的根部,并添加了下面这一行。

app.sessionSavePath = '/tmp/my_project_name/ci4_session'

如果你没有这个.env文件,就从这个默认的文件内容开始创建一个。

请注意文件名前面的点(.)。

CodeIgniter4 env号文件

附录

同样,在你的案例中,由于权限的限制,应用程序无法在你的项目根目录下的writable/cache文件夹中写入缓存文件。你肯定是在使用file作为你的缓存处理程序

解决方案

打开你的.env文件,该文件位于你的项目目录的根部,并添加下面的一行。

cache.storePath = '/tmp/my_project_name/ci4_cache'

提示

这些和更多的配置可以在你的.env文件中找到/修改,使用下面的规则。

  1. 配置类文件名,小写。例如:cache
  2. 后面是一个点(.)。
  3. 然后是public配置类的属性名称。I.e storePath.
  4. 步骤1,2,3结合起来,就是cache.storePath,成为你的.env文件的声明。然后是一个等号=。最后是.env文件的value'/tmp/my_project_name/ci4_cache')声明。最后得出的是,cache.storePath = '/tmp/my_project_name/ci4_cache'

配置类可以在你的项目根目录的app/Config文件夹中找到。即

app/Config/Cache.php
app/Config/App.php
steven7mwesigwa 提问于2022-08-30
steven7mwesigwa 修改于2022-08-30
#3楼
得票数 0

这对我来说是有效的,你应该试试这个

首先cd到你的文件所在的地方 例子

cd /opt/lampp/htdocs/

这是我的文件所在的地方

第二,在你的命令提示符中写下这个命令

sudo chmod -R 777 文件名

Fortune 提问于2022-11-23