Har*_*rts 4 php shell cakephp command-line-interface cakephp-2.0
我编写了一个 cakeshell 脚本,我计划使用 cronjob 来使用它。在手动运行它(在测试期间)时,有时我的网站会抛出 SplFileInfo 警告,例如:
Warning: SplFileInfo::openFile(/var/www/flat/app/tmp/cache/persistent/myapp_cake_core_file_map):
failed to open stream: Permission denied in /var/www/flat/lib/Cake/Cache/Engine/FileEngine.php on line 313
Warning (512): SplFileInfo::openFile(/var/www/flat/app/tmp/cache/models/myapp_cake_model_default_flat_list):
failed to open stream: Permission denied [CORE/Cake/Cache/Engine/FileEngine.php, line 313]
Warning (512): SplFileInfo::openFile(/var/www/flat/app/tmp/cache/models/myapp_cake_model_default_flat_list) [http://php.net/splfileinfo.openfile]:
failed to open stream: Permission denied [CORE/Cake/Cache/Engine/FileEngine.php, line 313]
Warning (512): _cake_model_ cache was unable to write 'default_flat_list' to File cache [CORE/Cake/Cache/Cache.php, line 309]
Warning (512): SplFileInfo::openFile(/var/www/flat/app/tmp/cache/persistent/myapp_cake_core_method_cache) [http://php.net/splfileinfo.openfile]:
failed to open stream: Permission denied [CORE/Cake/Cache/Engine/FileEngine.php, line 313]
Warning (512): SplFileInfo::openFile(/var/www/flat/app/tmp/cache/persistent/myapp_cake_core_method_cache) [http://php.net/splfileinfo.openfile]:
failed to open stream: Permission denied [CORE/Cake/Cache/Engine/FileEngine.php, line 313]
Warning (512): SplFileInfo::openFile(/var/www/flat/app/tmp/cache/models/myapp_cake_model_default_flat_list) [http://php.net/splfileinfo.openfile]:
failed to open stream: Permission denied [CORE/Cake/Cache/Engine/FileEngine.php, line 313]
Warning (512): SplFileInfo::openFile(/var/www/flat/app/tmp/cache/models/myapp_cake_model_default_flat_list) [http://php.net/splfileinfo.openfile]:
failed to open stream: Permission denied [CORE/Cake/Cache/Engine/FileEngine.php, line 313]
Warning (512): _cake_model_ cache was unable to write 'default_flat_list' to File cache [CORE/Cake/Cache/Cache.php, line 309]
Run Code Online (Sandbox Code Playgroud)
发生了什么?以及如何解决这个问题?
如果我检查缓存上的 tmp 目录并持久化某些文件,则它们处于 root 权限下。是这个原因吗?
[root@Apps103 persistent]# ls
total 40K
-rw-rw-r-- 1 apache 43 Apr 22 17:49 myapp_cake_core_cake_
-rw-rw-r-- 1 root 43 Apr 23 10:01 myapp_cake_core_cake_console_
-rw-rw-r-- 1 root 43 Apr 23 10:01 myapp_cake_core_cake_dev_
-rw-rw-r-- 1 apache 43 Apr 23 10:26 myapp_cake_core_cake_dev_en-us
-rw-rw-r-- 1 apache 43 Apr 23 10:26 myapp_cake_core_cake_en-us
-rw-rw-r-- 1 apache 43 Apr 23 10:26 myapp_cake_core_default_en-us
-rw-rw-r-- 1 root 4.3K Apr 23 10:01 myapp_cake_core_file_map
-rw-rw-r-- 1 root 4.3K Apr 23 10:01 myapp_cake_core_method_cache
Run Code Online (Sandbox Code Playgroud)
我把它放在引导程序中
Cache::config('default', array(
'engine' => 'File',
'mask' => 0666,
));
// short
Cache::config('short', array(
'engine' => 'File',
'duration' => '+1 hours',
'path' => CACHE,
'prefix' => 'cake_short_'
));
// long
Cache::config('long', array(
'engine' => 'File',
'duration' => '+1 week',
'probability' => 100,
'path' => CACHE . 'long' . DS,
));
Run Code Online (Sandbox Code Playgroud)
但它不起作用。通常我会清理整个 tmp 目录以删除警告。然后它会再次正常工作。我不知道为什么,但如果我运行 shell,警告错误不会显示,直到第二天。我的 tmp 目录 (flat/app/tmp) 具有 apache 权限。
tmp 文件夹通常位于应用程序目录中,并为所有请求共享,无论来源如何。一个相对常见的问题是通过 Web 请求创建的 tmp 文件对于控制台任务来说是只读的,反之亦然。
如果您以 root 身份运行 cli 任务,tmp 文件将以所有者 root 的身份创建 - 此后,Web 请求(由 apache 运行)可能会尝试删除或写入 tmp 目录,但无法修改现有 tmp 文件夹内容,因为文件归 root 所有。
要么让 cli 和 web 请求使用不同的tmp 目录,要么简单地确保 cli 和 web 用户都对 tmp 目录具有写入权限。
这意味着要么在 CakePHP 之前将 TMP 常量定义到 app/tmp 以外的位置,例如在cake.php中:
...
$ds = DIRECTORY_SEPARATOR;
define('TMP', '/tmp/myapp');
...
Run Code Online (Sandbox Code Playgroud)
或者确保 tmp 文件夹对两个用户都是可写的,例如:
cd app
chmod -R 777 tmp
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3745 次 |
| 最近记录: |