【问题标题】:Bilingual CodeIgniter cron job双语 CodeIgniter cron 作业
【发布时间】:2012-02-23 12:20:21
【问题描述】:

我使用 CodeIgniter 构建了一个双语应用程序,现在我需要 2 个 cron 作业来向某些用户发送电子邮件。

我遇到的问题是我无法运行 cron 作业,我相信这是因为我必须以多种语言运行 CodeIgniter。

我正在尝试运行此命令: php /home/[用户名]/public_html/projects/[项目名称]/index.php cron提醒

运行后我收到的电子邮件如下:

Content-type: text/html

<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  array_key_exists() [<a href='function.array-key-exists'>function.array-key-exists</a>]: The first argument should be either a string or an integer</p>
<p>Filename: core/MY_Lang.php</p>
<p>Line Number: 153</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  array_key_exists() [<a href='function.array-key-exists'>function.array-key-exists</a>]: The first argument should be either a string or an integer</p>
<p>Filename: core/MY_Lang.php</p>
<p>Line Number: 153</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  Cannot modify header information - headers already sent by (output started at /home/vchris/CI-2.0.1/core/Exceptions.php:170)</p>
<p>Filename: core/MY_Lang.php</p>
<p>Line Number: 73</p>

</div>

MY_Lang.php 标题在第 73 行

if ((!$url_ok) && (!$this->is_special($uri_segment['parts'][0]))) // special URI -> no redirect
        {
            // set default language
            $CFG->set_item('language', $this->languages[$this->default_lang()]);

            $uri = (!empty($this->uri)) ? $this->uri: $this->default_uri;
            $uri = ($uri[0] != '/') ? '/'.$uri : $uri;
            $new_url = $CFG->config['base_url'].$this->default_lang().$uri;

            header("Location: " . $new_url, TRUE, 302);
            exit;
        }

MY_Lang.php 返回在第 153 行

// default language: first element of $this->languages
 function default_lang()
    {
        $browser_lang = !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? strtok(strip_tags($_SERVER['HTTP_ACCEPT_LANGUAGE']), ',') : '';
        $browser_lang = substr($browser_lang, 0,2);
        return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang: 'en';
    }

基本上当您浏览我的网站时,如果您没有在 url 中设置语言,它会自动添加 /en/。有没有办法绕过它或在控制器中设置它?我认为 MY_Lang 在控制器之前被调用。所以也许有办法让我不必使用index.php进入CodeIgniter。

【问题讨论】:

    标签: php codeigniter cron


    【解决方案1】:

    在我看来 $browser_lang 在第 153 行是空的,因为 $_SERVER['HTTTP_ACCEPT_LANGUAGE'] 在第 151 行是空的,并且三元组将变量设置为空字符串。现在,当它检查 $this-&gt;languages 中的密钥时,它会抛出您的错误。

    我猜这与从命令行而不是浏览器调用它有关,并且没有设置 $_SERVER 变量。我会检查第 153 行,看看 $browser_lang 是否像这样为空:

    // default language: first element of $this->languages
    function default_lang()
    {
        $browser_lang = !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? strtok(strip_tags($_SERVER['HTTP_ACCEPT_LANGUAGE']), ',') : '';
        $browser_lang = substr($browser_lang, 0,2);
        return (!empty($browser_lang) && array_key_exists($browser_lang, $this->languages)) ? $browser_lang : 'en';
    }
    

    另一种选择可能是让您的 cron 作业使用 wget 而不是直接调用 PHP。

    【讨论】:

    • 感谢您的回复。将 wget 用于 cron 作业,是不是就像我要查看页面一样?我不希望任何人能够查看控制器/方法。
    • 是的,我猜这不是您想要的,但想把它作为另一种选择扔掉。您可以查看在 wget 请求中使用某种密钥作为参数,并将其与控制器方法中的硬编码值进行比较。同样,不理想,但另一种选择。
    • 我尝试更改 default_lang() 方法并且它可以工作,除了我将使用默认控制器而不是 cron 控制器。带有参数的 wget 可能是一种方法。
    猜你喜欢
    • 2013-03-05
    • 2011-01-15
    • 2011-11-11
    • 2012-08-01
    • 1970-01-01
    • 2015-02-10
    • 2013-03-11
    相关资源
    最近更新 更多