【发布时间】:2021-05-26 20:24:13
【问题描述】:
我在 cakephp 3 中有一个应用程序,几周前开始报告 open_basedir restriction in effect. File(/) is not within the allowed path(s)。我试图调试它,但我没有成功找到原因。该应用程序运行良好 2.5 年,现在才开始出现,但没有对使用缓存或更改配置的代码部分进行任何更改。在配置中,我为每种缓存模式正确设置了“路径”。而且它也不是来自一致的 url/方法。它现在随机出现在不到 1% 的电话中。更常见的是第一周左右。有什么办法可以调试这个并找到原因吗?您知道这种行为的任何可能原因吗?我已经尝试了所有我能想到的方法,但没有成功。
配置示例:
'hour' => [
'className' => 'File',
'path' => CACHE,
'serialize' => true,
'duration' => '+1 hour',
'url' => env('CACHE_DEFAULT_URL', null),
],
一个示例的调试跟踪:
Cake\Error\BaseErrorHandler::handleError() - CORE/src/Error/BaseErrorHandler.php, line 153
is_dir - [internal], line ??
Cake\Cache\Engine\FileEngine::_clearDirectory() - CORE/src/Cache/Engine/FileEngine.php, line 303
Cake\Cache\Engine\FileEngine::clear() - CORE/src/Cache/Engine/FileEngine.php, line 284
Cake\Cache\Engine\FileEngine::gc() - CORE/src/Cache/Engine/FileEngine.php, line 116
Cake\Cache\CacheRegistry::_create() - CORE/src/Cache/CacheRegistry.php, line 98
Cake\Core\ObjectRegistry::load() - CORE/src/Core/ObjectRegistry.php, line 96
DebugKit\Cache\Engine\DebugEngine::init() - ROOT/vendor/cakephp/debug_kit/src/Cache/Engine/DebugEngine.php, line 79
Cake\Cache\CacheRegistry::_create() - CORE/src/Cache/CacheRegistry.php, line 90
Cake\Core\ObjectRegistry::load() - CORE/src/Core/ObjectRegistry.php, line 96
Cake\Cache\Cache::_buildEngine() - CORE/src/Cache/Cache.php, line 170
Cake\Cache\Cache::engine() - CORE/src/Cache/Cache.php, line 228
Cake\Cache\Cache::read() - CORE/src/Cache/Cache.php, line 356
App\Controller\AppController::beforeRender() - APP/Controller/AppController.php, line 169
Cake\Event\EventManager::_callListener() - CORE/src/Event/EventManager.php, line 416
Cake\Event\EventManager::dispatch() - CORE/src/Event/EventManager.php, line 393
Cake\Controller\Controller::dispatchEvent() - CORE/src/Event/EventDispatcherTrait.php, line 110
Cake\Controller\Controller::render() - CORE/src/Controller/Controller.php, line 610
Cake\Http\ActionDispatcher::_invoke() - CORE/src/Http/ActionDispatcher.php, line 125
Cake\Http\ActionDispatcher::dispatch() - CORE/src/Http/ActionDispatcher.php, line 93
Cake\Http\BaseApplication::__invoke() - CORE/src/Http/BaseApplication.php, line 108
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Http\Middleware\EncryptedCookieMiddleware::__invoke() - CORE/src/Http/Middleware/EncryptedCookieMiddleware.php, line 89
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Http\Middleware\CsrfProtectionMiddleware::__invoke() - CORE/src/Http/Middleware/CsrfProtectionMiddleware.php, line 106
App\Application::App\{closure}() - APP/Application.php, line 93
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Http\Middleware\SecurityHeadersMiddleware::__invoke() - CORE/src/Http/Middleware/SecurityHeadersMiddleware.php, line 176
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Routing\Middleware\RoutingMiddleware::__invoke() - CORE/src/Routing/Middleware/RoutingMiddleware.php, line 104
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Routing\Middleware\AssetMiddleware::__invoke() - CORE/src/Routing/Middleware/AssetMiddleware.php, line 88
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Error\Middleware\ErrorHandlerMiddleware::__invoke() - CORE/src/Error/Middleware/ErrorHandlerMiddleware.php, line 98
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Http\Middleware\EncryptedCookieMiddleware::__invoke() - CORE/src/Http/Middleware/EncryptedCookieMiddleware.php, line 89
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
DebugKit\Middleware\DebugKitMiddleware::__invoke() - ROOT/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php, line 52
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Http\Runner::run() - CORE/src/Http/Runner.php, line 51
Cake\Http\Server::run() - CORE/src/Http/Server.php, line 81
[main] - ROOT/webroot/index.php, line 40
如有任何提示,我将不胜感激。
【问题讨论】:
-
/与CACHE指向什么关系?它可能是直接父目录吗?您的open_basedir选项,或者您的 PHP 版本最近是否已更改? -
据我所知或服务器管理员声称,不幸的是,PHP 版本和 open_basedir 设置都没有改变。
/比CACHE高 4 级。我真的被这个困住了。 -
我可以想象这是事情开始向南发展的地方:github.com/cakephp/cakephp/blob/3.5.18/src/Cache/Engine/…。如果
getRealPath()失败,你基本上会得到false . '/'。这需要在核心中修复(但您不会在 3.5 分支中获得修复),我建议您尝试记录$path及其指向的详细信息(权限等),使用$path->getRealPath()的条件返回false-ish 结果。也许是某种竞争条件,也许是权限问题,也许是完全不同的东西...... -
@ndm 非常感谢您的提示。我将尝试使用这部分代码,并在我有一些输出后尽快回复您。由于错误是随机发生的,而且我自己无法重现它,因此可能需要几天的时间。
-
这个has been patched 在 4.2.4 和 3.9.7
标签: php caching cakephp cakephp-3.0