问题
我在我的网站上使用CodeIgniter v2.1.4。我使用以下命令php -q /home/user_name/www/index.php controller my_method
设置了每2小时运行一次cronjob。但是这会输出我的默认控制器页面html内容(这是我的主页的html内容)。
受审
我在我的www目录中添加了一个名为test.php的文件,其中包含一个简单的echo&它运行正常,因此我确信CI中存在问题。此外,当我使用浏览器访问我尝试通过cron作业执行的控制器/方法时,它会输出正确的消息。
需要解决方案
我按照另一个主题&的建议使用了wget -q http://mywebsite.com/controller/my_method
它运行正常,但我想使用php -q
方式,因为那时我将能够拒绝从浏览器直接访问我的脚本。
答案 0 :(得分:3)
CodeIgniter使用CLI请求。所以你需要使用PHP CLI。
/usr/bin/php-cli /home/user_directory/public_html/index.php controller method
如果您的服务器上没有PHP CLI,则还有另一个选项;
您可以在CodeIgniter上启用查询字符串,并尝试像这样运行。
php -q /home/user_directory/public_html/index.php?c=controller&m=method
有关启用查询字符串的详细信息:CodeIgniter URLS
答案 1 :(得分:2)
它应该是(来自cPanel):
php /home/user_name/www/index.php controller method
但是,如果您使用命令行并且已输入crontab -e
:
30 2 * * * php /home/username/index.php welcome show
上面的示例将每天凌晨2:30运行。
希望这有帮助!
答案 2 :(得分:1)
我为更好地了解CodeIgnitre而道歉,但我想提一下,通过Web服务器的命令行PHP和PHP使用不同的环境变量(特别是可以使用不同的php.ini文件)以及重写和其他处理Web服务器可能会(特别是通过.htaccess但有时也在主配置中)可能会导致问题。
如果你在PHP脚本中运行phpinfo()函数,它会告诉你它应该使用php.ini文件。
我假设你已经检查了你的控制器和方法,并确保它们拼写正确且准确(我不知道大写是否重要)。
您可以使用CodeIgniter脚本进行简单的测试,以回显出您想要的控制器和方法。我猜你的命令行/ cron没有正确传递变量,并且它作为后退默认为主页。
答案 3 :(得分:1)
我昨天学到的是,您需要限制从控制器到控制台使用的功能,在控制器构造函数中阻止其Web调用
class Hello extends CI_Controller {
function __construct() {
if (isset($_SERVER['REMOTE_ADDR'])) {
die('Command Line Only!');
}
parent::__construct();
}
public function message($to = 'World'){
echo "Hello {$to}!".PHP_EOL;
}
}
然后,您需要在ci文件的根目录下创建一个cli.php
命令行文件
if (isset($_SERVER['REMOTE_ADDR'])) {
die('Command Line Only!');
}
set_time_limit(0);
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] = $argv[1];
require dirname(__FILE__) . '/index.php';
最后,为了运行该命令,您可以在控制台中键入:
php cli.php Hello message
或
php cli.php Hello message "parameter"
输出可能是"Hello World!"
或"Hello parameter!"
,您可能需要对控制器和函数名称进行一些调整,更多信息link以及来自codeigniter的cli文档。< / p>
答案 4 :(得分:0)
在项目的根目录下创建一个包含以下内容的executeCron.php文件:
#!/usr/local/bin/php
<?php
/*
|--------------------------------------------------------------
| CRON JOB BOOTSTRAPPER
|--------------------------------------------------------------
| PURPOSE
| -------------------------------------------------------------
| This script is designed to enable CodeIgniter controllers and functions to be easily called from the command line on UNIX/Linux systems.
|
|
| SETUP
| -------------------------------------------------------------
| 1) Place this file somewhere outside your web server's document root
| 2) Set the CRON_CI_INDEX constant to the location of your CodeIgniter index.php file
| 3) Make this file executable (chmod a+x cron.php)
| 4) You can then use this file to call any controller function:
| ./cron.php --run=/controller/method [--show-output] [--log-file=logfile] [--time-limit=N] [--server=http_server_name]
|
|
| OPTIONS
| -------------------------------------------------------------
| /controller/method Required The controller and method you want to run.
|
| NOTE: Do not load any authentication or session libraries in controllers you want to run via cron. If you do, they probably won't run right.
*/
define('CRON_CI_INDEX', dirname(__FILE__)."/index.php"); // Your CodeIgniter main index.php file
define('CRON', TRUE); // Test for this in your controllers if you only want them accessible via cron
# Parse the command line
$script = array_shift($argv);
$cmdline = implode(' ', $argv);
$usage = "Usage: executeCron.php /login/index \n\n";
$required = array('--run' => FALSE);
foreach($argv as $arg)
{
/*switch($arg)
{
case 'cronRemoveStories/index':*/
// Simulate an HTTP request
//$_SERVER['PATH_INFO'] = $arg;
$_SERVER['REQUEST_URI'] = $arg;
$_SERVER['REMOTE_ADDR'] = '';
$required['--run'] = TRUE;
break;
/* default:
die($usage);
}*/
}
if(!defined('CRON_LOG')) define('CRON_LOG', 'cron.log');
if(!defined('CRON_TIME_LIMIT')) define('CRON_TIME_LIMIT', 0);
foreach($required as $arg => $present)
{
if(!$present) die($usage);
}
# Set run time limit
set_time_limit(CRON_TIME_LIMIT);
# Run CI and capture the output
ob_start();
if(file_exists(CRON_CI_INDEX)){
require(CRON_CI_INDEX); // Main CI index.php file
}else{
die(CRON_CI_INDEX." not found.");
}
$output = ob_get_contents();
ob_end_clean();
# Log the results of this run
error_log("### ".date('Y-m-d H:i:s')." cron.php $cmdline\n", 3, CRON_LOG);
?>
现在编写控制器并配置Crontab如下(如果需要,请更正文件路径):
0 * / 2 * * * php /home/user_name/www/executeCron.php --run = / controllername / methodname
答案 5 :(得分:0)
在crontab中你也可以使用curl来运行URL的
所以你可以这样做
*/10 * * * * curl 'http://www.example.com/controller/action'
希望这会对你有所帮助
答案 6 :(得分:0)
我遇到了同样的问题。我尝试了很多东西。最后,为什么index.php被显示的原因是因为我的config.php中的以下行被设置为“QUERY_STRING”
当我将其更改为以下
时$ config ['uri_protocol'] =“自动”;
它按预期工作。
希望这有帮助