首页 文章

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

提问于
浏览
4

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

但是,CodeIgniter User Guide表示现在可以从命令行执行此操作,例如运行:

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

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

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

Could someone explain how I might be able to set up a cron job on shared hosting using CodeIgniter please?

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

tools.php

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

}?>

4 回答

  • 0

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

  • 0

    我们解决了这个问题如下:

    • 设置由cron安排的普通php文件 . 与codeigniter无关

    • 在其中,您可以像在网上一样,发出fsocket或curl请求来执行常规的CodeIgniter调用 .

    这是一个例子(例如,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函数 . 奇迹般有效 .

  • 3

    我在这样的共享主机上设置了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框架 .

  • 0

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

    wget http://example.com/cronjob/
    

    而不是创造新的或简单的东西

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

相关问题