来自CLI的Codeigniter cron作业会引发memcached错误

时间:2011-11-27 13:08:52

标签: php codeigniter cron

我正在尝试为我的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;
                }
            }
        }
    }   
}

2 个答案:

答案 0 :(得分:9)

首先要尝试的是确定是否支持memcached。

var_dump($this->cache->memcached->is_supported());

要确保的第二件事是memcached.php

中有application/config/个文件

它应该包含一个memcached主机的多维数组,其中包含以下键:

  • host
  • port
  • weight

以下示例定义了两个服务器。数组键server_1server_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->memcachedNULL(或者未初始化),这意味着缓存尚未初始化。

一个简单的解决方法就是自己简单地创建memcache对象。但是,正确的解决方法是查看源代码并跟踪memcache对象通常如何实例化(查找new Memcache并在那里设置debug_print_backtrace()。跟踪调试堆栈并将其与什么进行比较你的cron确实 - 看看它出错的地方然后纠正它)。这是基本的调试顺便说一句,抱歉。

另外,请确保加载驱动程序。如果您的cron使用不同于正常索引的引导函数(从未使用过CI,那是否可能?),请确保将memcache init放在正确的位置。

-edit -

$this->cache->memcached可能实际上不是NULL,但在开始调用get()之前,确实没有与Memcache服务器建立实际连接。