我在Kohana上收到错误"在非对象上调用成员函数add()":$log
目录中没有登录application/logs
。我描述的错误是在 apache error_log
上找到的。这就是它的外观
[2012 年 8 月 17 日星期五 17:07:09] [错误] [客户端 MY.国际音标。复员方案。ESS] PHP 致命错误:在第 8 行的/var/www/html/application/classes/kohana/exception.php 中的非对象上调用成员函数 add()
这是我的错误控制器。
<?php
class Kohana_Exception extends Kohana_Kohana_Exception {
public static function handler(Exception $e) {
if (Kohana::DEVELOPMENT === Kohana::$environment) {
parent::handler($e);
} else {
try {
Kohana::$log->add(Log::ERROR, "own exception handler");
Kohana::$log->add(Log::ERROR, parent::text($e));
$attributes = array('action' => 500, 'message' => rawurlencode($e->getMessage()));
if ($e instanceof HTTP_Exception) {
$attributes['action'] = $e->getCode();
}
// Error sub-request.
echo Request::factory(Route::get('error')->uri($attributes))->execute()->send_headers()->body();
}
catch(Exception $e) {
// Clean the output buffer if one exists
ob_get_level() and ob_clean();
// Display the exception text
echo parent::text($e);
// Exit with an error status
exit(1);
}
}
}
}
从代码来看Kohana::$log
似乎尚未初始化。但是这段代码已经工作了很长时间。现在是什么让它不起作用?
我在 Fedora 15 上使用带有 PHP 5.3.13 的 Kohana-3.2
我已经解决了这个问题。如果这个问题发生在任何其他kohana开发人员身上,并且他从谷歌来到这里,这就是解决方案。
从根外壳运行以下命令。请记住,如果您重新启动服务器,则必须再次运行它。
setsebool -P httpd_unified 1
附加信息:如何追踪它。
检查这些位置
- 阿帕奇错误日志
- Kohana 在应用程序目录上记录(如果您记录用于调试)
- 检查
/var/log/messages
。
如果是 SElinux 问题,您会在 /var/log/messages
上找到日志条目。这就是我得到的。
setroubleshoot:SELinux 阻止/usr/sbin/httpd 对目录/var/www/html/application/cache 进行写入访问。对于完整的 SELinux 消息。运行 SEALERT -L 087DFDB5-C7DE-4238-8E6B-A713213A456D
如前所述,运行sealert -l 087dfdb5-c7de-4238-8e6b-a713213a456d
将显示我编写的命令作为解决方案。
尝试查看是否:
Log::instance()->add(Log::ERROR, "own exception handler");
工程。当前的 Kohana 文档似乎表明使用 $log 应该仍然有效,但它可能会在异常处理之前的某个地方取消设置。但是,从 Log 类检索实例应该随时可用。
您可能遇到权限问题。就我而言,是httpd服务(apache2)无法访问项目文件。这是一个残酷的解决方案(仅在您的安全情况允许的情况下才这样做):
$ sudo chmod -R 0777/var/www/html/mysite/
从:move_uploaded_file在我所做的所有配置后给出"无法打开流:权限被拒绝"错误