新的Codeigniter 4项目获得错误" CodeIgniter\Cache\Exceptions\CacheException Cache unable to write to ..."
几乎所有的时候,当我开始一个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);
解决这个问题的最好方法是什么?
在做了研究之后,我总结出两个选项
选项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权限)。
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
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
文件,就从这个默认的文件内容开始创建一个。
请注意文件名前面的点(.
)。
附录
同样,在你的案例中,由于权限的限制,应用程序无法在你的项目根目录下的writable/cache
文件夹中写入缓存文件。你肯定是在使用file
作为你的缓存处理程序。
解决方案
打开你的.env
文件,该文件位于你的项目目录的根部,并添加下面的一行。
cache.storePath = '/tmp/my_project_name/ci4_cache'
提示
这些和更多的配置可以在你的.env
文件中找到/修改,使用下面的规则。
- 配置类文件名,小写。例如:
cache
。 - 后面是一个点(
.
)。 - 然后是
public
配置类的属性名称。I.estorePath
. - 步骤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
这对我来说是有效的,你应该试试这个
首先cd到你的文件所在的地方 例子。
cd /opt/lampp/htdocs/
这是我的文件所在的地方
第二,在你的命令提示符中写下这个命令
sudo chmod -R 777 文件名