如何为服务器上的 codeigniter 脚本设置 cron 作业

Posted

技术标签:

【中文标题】如何为服务器上的 codeigniter 脚本设置 cron 作业【英文标题】:How to setup cron job for a codeigniter script on server 【发布时间】:2015-11-17 18:27:36 【问题描述】:

您好,我正在尝试使用 cpanel 为服务器上的脚本设置 cron 作业,但是我从未这样做过,如果有人可以指导我,这将非常有帮助。

脚本路径:/home/name/public_html/application/modules/stockupdate/controllers/stockupdate.php

我需要每小时运行一次这个脚本,我已经阅读了教程并且我尝试使用以下命令:

1) php /home/name/public_html/index.php stockupdate 
2)/home/name/public_html/application/modules/stockupdate/controllers/stockupdate.php

第一个发送以下错误:

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

<p>Severity: Notice</p>
<p>Message:  Undefined index: REMOTE_ADDR</p>
<p>Filename: core/Input.php</p>
<p>Line Number: 351</p>

<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/name/public_html/system/core/Exceptions.php:185)</p>
<p>Filename: libraries/Session.php</p>
<p>Line Number: 689</p>

<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/name/public_html/system/core/Exceptions.php:185)</p>
<p>Filename: helpers/url_helper.php</p>
<p>Line Number: 542</p>

第二个命令向我发送访问被拒绝的错误。如果有人可以指导我创建 cron 工作,我将不胜感激。谢谢

stockupdate.php

<?php
class StockUpdate extends Backend_Controller

    public function __construct()
    
        parent::__construct();
        $this->load->library('ftp');
        $this->load->library('csvimport');
        $this->load->model('stock_update_model');
        ini_set('memory_limit', '3000M');
        set_time_limit(0); 
    

    function index()
    
        if ($this->input->is_cli_request())
        
            $this->stock_update_model->truncate_stock();
            $this->update_stock();
        
    

    public function update_stock()
    
        $ftpServer = "server";
        $ftpUser = "username";
        $ftpPassword = "password";

        $ftp_server = $ftpServer;
        $ftp_conn = ftp_connect($ftp_server);
        $ftp_login = ftp_login($ftp_conn, $ftpUser, $ftpPassword ); 

        if(!$ftp_conn) 
            die("A connection to $ftpServer couldn't be established"); 
        else if(!$ftp_login) 
            die("Your login credentials were rejected"); 
        else
        
            $stock_file = "/home/name/files/uploads/stock.CSV";

            $server_file = "/stock.CSV"; 

            if (ftp_get($ftp_conn, $stock_file, $server_file, FTP_BINARY)) 
            
                if (($handle = fopen($stock_file, "r")) !== FALSE) 
                
                    while (($data = fgetcsv($handle)) !== FALSE) 
                    
                        $product_code = $data[0];
                                $stock = $data[1];


                                $this->stock_update_model->update_stock($product_code, $stock); 
                                
                                else
                                
                                    continue;
                                
                    
                    fclose($handle);
                    unlink($stock_file);
                
                else
                
                    echo "Error reading stock file.\n";
                
            
            else 
            
                echo "There was a problem\n";
            
        
    

【问题讨论】:

你应该向我们展示你的控制器文件stockupdate.php 感谢您的回复,请稍等,我会补充。 尝试通过应用程序 url 设置 cron 作业。例如'localhost/app_name/controller_name/function_name' cron 作业不起作用 bcz CI 需要执行系统文件,并且系统文件路径是相对定义的。因此,通过完整的网址尝试它的工作原理。 【参考方案1】:

试试这个吧。

php /full-path-to-cron-file/cron.php /test/index

参考 [http://www.asim.pk/2009/05/14/creating-and-installing-crontabs-using-codeigniter/]

【讨论】:

试试这个asim.pk/2009/05/14/…他会帮助你的。【参考方案2】:

您可以将ob_start() 放入配置文件中以删除最后两个错误。

【讨论】:

【参考方案3】:

如此处所述:https://ellislab.com/codeigniter/user-guide/general/cli.html 您应该获取控制器类名称和方法名称,并使用它们来构建 CLI 命令,如下所示:

php <path to your CI index.php> <name of the controller class> <name of the function> <optional arguments>

所以你的代码:

php /home/name/public_html/index.php stockupdate stock_update

【讨论】:

【参考方案4】:

使用/usr/local/bin/php 而不是php 让codeigniter 接收URI 段。

如果可行就试试这个

/usr/local/bin/php /home/name/public_html/index.php stockupdate index

【讨论】:

【参考方案5】:
wget -t=1 https:// codeginter.com/controller/method

t 设置为尝试次数。

【讨论】:

【参考方案6】:

我用了这个推荐

/usr/bin/curl http://example.com/controller/method

【讨论】:

以上是关于如何为服务器上的 codeigniter 脚本设置 cron 作业的主要内容,如果未能解决你的问题,请参考以下文章

如何为真正的多语言网站设置 CodeIgniter?

如何为codeigniter设置cron作业url?

如何为 CodeIgniter 设置 date.timezone 以使用 php 5.3

如何为 HTTPS (SSL) 配置 Codeigniter?

如何为开发机器设置本地绑定服务器以映射到服务器上的虚拟主机

如何为codeigniter中的特定列数据赋予颜色?