CodeIgniter Cron有关共享主机的工作吗?

时间:2011-11-30 20:07:39

标签: codeigniter cron crontab shared-hosting cpanel

我正在尝试学习如何使用CodeIgniter完成我的第一个cron作业。在过去,似乎使用CI执行此操作的唯一方法是使用wget命令而不是php

然而,CodeIgniter User Guide表示您现在可以从命令行执行此操作,例如通过运行:

$ cd /path/to/project;
$ php index.php controller method

这在我的本地设置上使用终端很有用。但是当我在共享主机上的cPanel的cron部分中使用类似的命令时,该任务只返回index.php的内容。

我不完全确定cPanel对这个命令做了什么,所以不确定它是否正在使用命令行。

有人可以解释我如何使用CodeIgniter在共享主机上设置cron作业吗?

以下是CodeIgniter用户指南中的示例代码:

tools.php     

public function message($to = 'World')
{
    echo "Hello {$to}!".PHP_EOL;
}

} ?>

4 个答案:

答案 0 :(得分:3)

这将取决于你的主人。如果你不小心,Cron的工作可能真的搞砸了,所以很多共享主机都不允许这样做。您可能需要使用某个虚拟容器(如VPS,virtuozo等)来执行此操作。这不是CodeIgniter问题,而是托管服务提供商问题。先打电话给他们。

答案 1 :(得分:0)

我们解决了以下问题:

  1. 设置由cron安排的普通php文件。与codeigniter无关
  2. 在其中,您可以像在网上一样制作fsocket或curl请求来执行常规的CodeIgniter调用。
  3. 这是一个例子(例如,cron.php)

    #!/usr/local/bin/php.cli
    <?php
    DEFINE('CRON_CALL_URL','https://my_server/'); // 
    
    DEFINE('CRON_HTTPS_PORT', 443); // port to use during fsocket connetion
    DEFINE('CRON_SSL_PREFIX', 'ssl://'); // prefix to be used on the url when using ssl
    $current_time = now();
    $md5_hash = md5('somevalue'.$current_time);
            $url = CRON_CALL_URL.'MYCTRL/MYMETHOD'; 
            $parts=parse_url($url);
            // 
            $parts['query']='md5_hash='.$md5_hash.'&time='.$current_time;    
            $fp = fsockopen(CRON_SSL_PREFIX.$parts['host'],
                isset($parts['port'])?$parts['port']:CRON_HTTPS_PORT,
                $errno, $errstr, 30);
    
            if (!$fp) {
            } else {
    
                if (!array_key_exists('query', $parts)) $parts['query'] = null;
                $out = "POST ".$parts['path']." HTTP/1.1\r\n";
                $out.= "Host: ".$parts['host']."\r\n";
                $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
                $out.= "Content-Length: ".strlen($parts['query'])."\r\n";
                $out.= "Connection: Close\r\n\r\n";
                if (isset($parts['query'])) $out.= $parts['query'];
    
                fwrite($fp, $out);
                fclose($fp);
            }
    }
    ?>
    

    注意:确保您的MYCTRL / MYMETHOD功能

    ignore_user_abort(true);
    

    当你关闭fsocket连接时,你的脚本仍会运行到最后。

    由于各种原因,我们实际上有一堆这些fsockets。如果您需要确保对该控制器/方法的调用来自cron脚本,则需要传递一些额外的哈希值,以便只有cron和脚本知道它。调用脚本后,它可以访问任何codeigniter函数。像魅力一样。

答案 2 :(得分:0)

我在这样的共享主机上设置了100个CI cronjob:创建一个简短的PHP脚本,它调用CI控制器,好像它是一个webbrowser。

因此,script.php包含:

      script #! /usr/local/bin/php -f /home/example/public_html/script.php 

  <?php
     get_get_contents('http:example.com/cronjob/');     
  ?>

然后在cPanel中设置你的cronjob来调用script.php 当它运行时,Script.php将调用Codeigniter Cronjob控制器。在那里,您可以使用整个CI框架。

答案 3 :(得分:0)

如果您打算将其称为Web浏览器,为什么不替换cronjob 命令:

wget http://example.com/cronjob/

而不是创建新的或简单的

curl --suppress http://example.com/cronjob/`