2012-01-31 51 views
0

我使用CodeIgniter構建了一個雙語應用程序,現在我需要2個cron作業將電子郵件發送給某些用戶。雙語CodeIgniter cron作業

我遇到的問題是我無法運行cron作業,我相信這是因爲我必須以多種語言運行CodeIgniter。

我試圖運行這個命令: PHP /家/ [用戶名] /的public_html /項目/ [項目名稱]的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。

回答

0

它在我看來就像$browser_lang在第153行是空的,因爲$_SERVER['HTTTP_ACCEPT_LANGUAGE']在第151行是空的,而三元組將變量設置爲空字符串。現在,當它檢查$this->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。

+0

感謝您的回覆。 使用wget作爲cron作業,是不是就像我會查看該頁面?我不希望任何人能夠查看控制器/方法。 – Chris 2012-01-31 20:39:13

+0

是的,我想這不是你想要的,但是想把它當作另一種選擇。你可以使用某種祕密密鑰作爲wget請求中的參數,並將其與控制器方法中的硬編碼值進行比較。再次,不理想,但另一種選擇。 – gstjohn 2012-01-31 21:07:45

+0

我試着用default_lang()方法改變它,除了我要去的默認控制器而不是cron控制器。 wget與param可能是一種做法。 – Chris 2012-02-01 13:39:56