2012-07-19 70 views
3

有沒有辦法讓腳本可以做到像$this->EE->db這樣的東西(即使用Expression Engine的類,例如訪問數據庫),但可以在命令行中運行?使用表達式引擎的獨立PHP腳本

我試過搜索它,但文檔似乎沒有包含此信息(請correct me if I'm wrong)。我使用EE 2.4(上面的鏈接應該指向2.4文檔)。

回答

4

下面的文章似乎有一種可能的方法:Bootstrapping EE for CLI Access

  • 複製你的index.php文件,並將其命名爲cli.php。
  • 將index.php文件移到您的DOCUMENT_ROOT之外。從技術上講,這並不是必需的,但是沒有理由要盯着你的努力工作,所以爲什麼不保護它。
  • 在cli.php裏面更新第26行的$ system_path指向你的系統文件夾。
  • 在cli.php裏面,將第96行的$ routing ['controller']更新爲cli。
  • 在cli.php裏面,將第96行的APPPATH更新爲$ system_path.'cli /'。
  • 複製system/expressionengine目錄並將其命名爲system/cli。
  • 複製cli/controllers/ee.php文件並將其命名爲cli/controllers/cli.php。
  • 最後,將cli/controllers/cli.php中的類名更新爲Cli並刪除這些方法。
  • 默認情況下,EE調用索引方法,因此請添加一個索引方法來執行您所需的操作。
+0

真的有用!我在這裏列出了重要的部分以供將來參考(最好這樣做,而不是僅僅鏈接到可能存在或可能不存在的URL)。歡迎來到SO! – cambraca 2012-07-20 14:36:15

2

@Zenbuman這是爲出發點有用的,雖然我想補充我和我所有的要求去CLI問題 - >指數,而我想一些去CLI-> TASK1,CLI- > task2 etc

我必須更新* system \ codeigniter \ system \ core \ URI.php *以便它知道如何提取我通過命令行傳遞的參數,我從下面的代碼中獲得了代碼支持CLI的Codeigniter的更新版本

// Is the request coming from the command line? 
if (php_sapi_name() == 'cli' or defined('STDIN')) 
{ 
    $this->_set_uri_string($this->_parse_cli_args()); 
    return; 
} 

// Let's try the REQUEST_URI first, this will work in most situations 

而且在同一個文件

private function _parse_cli_args() 
{ 
    $args = array_slice($_SERVER['argv'], 1); 

    return $args ? '/' . implode('/', $args) : ''; 
} 

也不得不註釋掉我cli.php文件中的以下所有路由是要索引方法在我的CLI控制器和無視我的參數創建功能

/* 
* ~ line 109 - 111 /cli.php 
* --------------------------------------------------------------- 
* Disable all routing, send everything to the frontend 
* --------------------------------------------------------------- 
*/ 
$routing['directory'] = ''; 
$routing['controller'] = 'cli'; 
//$routing['function'] = ''; 

即使離開

$routing['function'] = ''; 

將強制要求去索引控制器

最後我覺得這有點不好意思,但我真的需要在我的情況下使用EE API庫。否則,我會只用Codeigniter創建一個單獨的應用程序來處理我的CLI需求,希望以上可以幫助其他人。

1

我發現@ Zenbuman的答案解決了我自己的這個問題的變化。我的示例允許您將cron腳本保留在模塊中,因此如果您需要您的模塊具有cron功能,則它們都保持整齊打包在一起。 Here's a detailed guide on my blog