我正在尝试为我的Codigniter应用程序设置cron作业,但是当我运行cron时,它会抛出memcached错误:
PHP致命错误:在第50行的/var/www/domain.com/www/dev/system/libraries/Cache/drivers/Cache_memcached.php中的非对象上调用成员函数get()
致命错误:在第50行的/var/www/domain.com/www/dev/system/libraries/Cache/drivers/Cache_memcached.php中的非对象上调用成员函数get()
虽然我不知道为什么这一直在抛出,我找不到我的cron作业文件中的任何错误,也不知道如何解决这个问题,因为我不知道这是在哪里调用,我调查了我的自动加载的库和帮助程序,它们似乎都没有错。
我也可以确认安装了memcached,如果我访问我的网站,memcached确实有效。
我尝试使用get()
来抑制Cached_memcached.php
中的@
,但这没有用,因为没有显示输出(但应该显示输出)。
我为cron(用户:www-data
)运行的命令是:
/usr/bin/php -q /var/www/domain.com/www/dev/index.php cron run cron
我正在运行Ubuntu 11.10 x86_64。
这是我的cron文件:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Cron extends CI_Controller {
var $current_cron_tasks = array('cron');
public function run($mode)
{
if($this->input->is_cli_request())
{
if(isset($mode) || !empty($mode))
{
if(in_array($mode, $this->current_cron_tasks))
{
$this->benchmark->mark('cron_start');
if($mode == 'cron')
{
if($this->cache->memcached->get('currency_cache'))
{
if($this->cache->memcached->delete('currency_cache'))
{
$this->load->library('convert');
$this->convert->get_cache(true);
}
}
echo $mode . ' executed successfully';
}
$this->benchmark->mark('cron_end');
$elapsed_time = $this->benchmark->elapsed_time('cron_start', 'cron_end');
echo $elapsed_time;
}
}
}
}
}
答案 0 :(得分:9)
首先要尝试的是确定是否支持memcached。
var_dump($this->cache->memcached->is_supported());
要确保的第二件事是memcached.php
application/config/
个文件
它应该包含一个memcached主机的多维数组,其中包含以下键:
host
port
weight
以下示例定义了两个服务器。数组键server_1
和server_2
无关,但它们可以命名。
$config = array(
'server_1' => array(
'host' => '127.0.0.1',
'port' => 11211,
'weight' => 1
),
'server_2' => array(
'host' => '127.0.0.2',
'port' => 11211,
'weight' => 1
)
);
接下来我要检查的是检查控制器是否可以在Web浏览器中运行而不是CLI,或者是否出现相同的错误。
此外,显式加载memcached驱动程序可能值得尝试。以下内容将加载memcached
驱动程序,并且在file
缓存驱动程序上调用失败。
$this->load->driver('cache', array('adapter' => 'memcached', 'backup' => 'file'));
使用此方法,您可以致电$this->cache->get();
以考虑回退。
要检查的另一件事是你没有为web和CLI使用单独的php.ini文件。
在Ubuntu上,它位于
/etc/php5/cli/php.ini
并且您应该确保存在以下行,而不是注释掉
extension=memcache.so
或者,您可以创建具有相同内容的文件/etc/php5/cond.d/memcache.ini
。
更改配置文件后,请不要忘记重新启动服务。
您可以通过执行以下
来确认使用CLI确实正确设置了memcached php -i | grep memcache
答案 1 :(得分:1)
问题是$this->cache->memcached
是NULL
(或者未初始化),这意味着缓存尚未初始化。
一个简单的解决方法就是自己简单地创建memcache对象。但是,正确的解决方法是查看源代码并跟踪memcache对象通常如何实例化(查找new Memcache
并在那里设置debug_print_backtrace()
。跟踪调试堆栈并将其与什么进行比较你的cron确实 - 看看它出错的地方然后纠正它)。这是基本的调试顺便说一句,抱歉。
另外,请确保加载驱动程序。如果您的cron使用不同于正常索引的引导函数(从未使用过CI,那是否可能?),请确保将memcache init放在正确的位置。
-edit -
$this->cache->memcached
可能实际上不是NULL
,但在开始调用get()
之前,确实没有与Memcache服务器建立实际连接。