【问题标题】:Running Codeigniter via CLI outputs website root instead of expected result通过 CLI 运行 Codeigniter 输出网站根目录而不是预期结果
【发布时间】:2011-12-02 09:38:29
【问题描述】:

我正在关注 this tutorial 通过 CLI 运行 Codeigniter。我已经完成了他们所做的一切(复制和粘贴),现在当我运行此命令时,除了输出网站索引内容外,它没有执行预期的操作。

$ cd /Users/MyUsername/Sites/code
$ php index.php tools message

我得到的输出是索引页面的 HTML 源,例如http://localhost/code.

预期的结果应该是

Hello World!

我怎样才能做到这一点才能让它发挥作用?

【问题讨论】:

  • 你的 CodeIgniter 版本是多少?
  • 当您在浏览器中访问工具/消息时,您会得到“Hello World!” ?
  • 你试过 $this->input->is_cli_request() 吗?
  • 可能解决方案是 stackoverflow.com/questions/10322587/… ,为我工作

标签: php codeigniter command-line-interface


【解决方案1】:

试试这个:

php index.php/controller/function/param1/param2/param3 etc

php index.php controller function param1 param2 param3 etc

另外,从 config.php 发布您的 $_SERVER var 的内容和“uri_protocol”变量的值。

$config['uri_protocol'] 应该是'AUTO'

【讨论】:

  • 我也有类似的问题,但是当我使用php index.php/tools/message 时出现No input file specified. 错误
  • 米哈伊尔,我和你有同样的问题。你找到解决办法了吗?
  • php index.php/tools/message 在我运行 docker exec 时不起作用,我必须将 $config['uri_protocol'] 更改为 'AUTO'。
  • 如果您尝试通过 CLI 在与 CRON 共享的 Web 主机上运行 Codeigniter,则 php 命令本身可能是问题所在。我在 cPanel 上写了一个 CRON 行,但是 index.php 脚本没有得到参数。最后它使用 PATH_INFO 选项和用空格分隔的参数,但我不得不使用命令 /usr/local/bin/php 而不是 /usr/bin/php
【解决方案2】:

好吧,很抱歉,但在此页面上https://ellislab.com/codeigniter/user-guide/general/cli.html

他们没有提到我们放置 codeigniter 的文件夹的根路径还是控制器文件夹。我对这个问题进行了很多搜索。我尝试了不同的方法,然后我发现了。

在此之前将 PHP 设置为您的 PATH 环境变量 {Run php file in windows CMD}

设置PATH环境变量后

  1. 进入cmd
  2. cd 放置 codeigniter 的路径(即 CI/)
  3. php index.php/tools/message

你会得到

Hello World!

在你的 cmd 屏幕上。

【讨论】:

    【解决方案3】:

    我知道这个问题已经过时并且已经被回答了,但是对于我自己和其他人来说,选择的答案不起作用。我发现工作只是使用wget。在您因为正在寻找不允许外部访问者的东西而对我投反对票之前,请听我说完!

    如果您将wget$this->input->ip_address(); 结合使用,您可以确保访问您的脚本的唯一机器是您自己的网络服务器。它不如能够使用php index.php controller function在本地调用文件,但它是一个后备。

    这是我创建的,已经工作了几个月没有问题:

    1. 在您的服务器上的某处创建一个目录,您可以将其用作 wget 创建的临时文件的便签本。我在public_html 文件夹的下一层创建了一个名为cron 的文件夹。

      例如。 /home/myuser/cron

    2. 构建你的 cron 命令。您可以使用&& 将命令串在一起。

      我。 cd /home/myuser/cron && -- 移动到你的暂存目录

      二。 wget http://www.site.com/cron/foo && -- wget你的文件

      三。 rm -f foo -- 从你的暂存目录中删除下载的文件“foo”

    3. 您的最终命令将如下所示:

      cd /home/myuser/cron && wget http://www.site.com/cron/foo && rm -f foo

    4. 检查访问您的 cron 文件的 IP 地址是否等于您的网络服务器的 IP:

      <?php defined('BASEPATH') OR exit('No direct script access allowed');
      
      class Cron extends MY_Controller {
      
          public function __construct()
          {
      
              parent::__construct();
      
              // this controller can only be called from the IP xxx.xxx.xxx.xxx
              if ($this->input->ip_address() !== 'xxx.xxx.xxx.xxx'){
      
                  show_error('Direct access is not allowed');
      
              }
      
          }
      
          function foo($bar = 'bar')
          {
      
              echo $this->input->ip_address();
      
          }
      
      }
      

    重要提示:请确保您完全了解rm -f 的影响。如果您不提供正确的文件,它可能会产生有趣的后果。如果您有空闲时间,您可以选择不删除该文件,而只需定期手动删除所有 cron 临时文件。

    【讨论】:

    • 是的,这对想要使用wget 的人来说非常有用。请注意,您可以在运行wget后使用--delete-after删除下载的页面。
    • 嗯,我不知道。我应该先阅读手册页。这可能比使用 rm 更好。
    【解决方案4】:

    这对我有用 - 发现于 http://www.daharveyjr.com/codeigniter-cli-command-line-interface/

    $config['uri_protocol'] = 'CLI';
    

    然后我就这样跑

    php index.php controller/function/parameter
    

    【讨论】:

      【解决方案5】:

      对我来说,这是通过更改解决的

      $config['uri_protocol'] = 'AUTO' 
      

      在主配置文件中。

      我之前把它改成了

      'REQUEST_URI'
      

      显然哪个不适用于 CLI。

      【讨论】:

      • 当时试图从 uri_protocol 设置为“PATH_INFO”的 cli 运行不起作用,将其更改为“AUTO”为我做了。谢谢!
      【解决方案6】:

      我得到的输出是索引页面的 HTML 源,例如http://localhost/code.

      您的路由出现错误,您的新示例 CLI 控制器没有被触发,而是另一个控制器。 你的路由有哪些错误很难说,因为你没有展示你的整个代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        相关资源
        最近更新 更多