我见过很多关于cron和ZF的帖子,但是大多数解决方案都让这项工作可以让公众触发。
如果您想设置一个只能由cron运行的操作,该怎么办?不是某个匿名用户而是某个必须登录的人?
我正在使用的解决方案是将文件放在我的web根目录之外,让它足够引导ZF以使用我需要的东西(比如,我不需要视图),然后从cron中找到它。 我的问题是,这是一种“最佳实践”方式吗?如果您需要通过网络访问代码但仍需要阻止随机用户查找和运行代码,该怎么办?
为了说明,这里是我正在做的(有效)从php命令行运行的cron作业,并在同一台服务器上,如下所示:
* 10 * * * php /Apps/ZF/cronjobs/crontest.php
Webroot是:/Apps/ZF/someproject/
crontest.php:
<?php
ini_set('include_path', ini_get('include_path') . ':/Apps/ZF/someproject/library');
define('APPLICATION_PATH','/Apps/ZF/someproject/application');
define('APPLICATION_ENVIRONMENT','test');
//Include the loader (for loading ZF resources)
require_once 'Zend/Loader.php';
//Include the model (to access the Sites model in this case)
require_once(APPLICATION_PATH . '/models/Planets.php');
Zend_Loader::registerAutoload();
$configuration = new Zend_Config_Ini(
APPLICATION_PATH . '/config/config.ini',
APPLICATION_ENVIRONMENT
);
// DB adapter
$dbAdapter = Zend_Db::factory($configuration->database);
// DB table setup
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
// Whatever code we want to run...
$test = new Model_Planets();
$test->fetchEntries();
Zend_Debug::dump($test);
?>
所以,正如我所说,这是有效的,所以我不是在找人给我写一个解决方案......只是好奇这样做“更好”。另外,如果我需要通过网络访问它但仍想保持它只能由cron运行怎么办?如何使它更灵活(因为在这里我很难编写一些我怀疑可以变得更有活力的路径)?
我假设我可以列出允许的服务器列表,然后使用$_SERVER['REMOTE_ADDR']
进行测试?
你们都在想什么?建议?我独自工作,所以我没有同事在这方面寻求帮助......在某种程度上,我是我的同事。
答案 0 :(得分:8)
一种方法是设置环境变量。
所以在你的crontab中
SCRIPT_RUN_ENV=cron
* * * * * foo.php // Whatever your line is
然后,在应用程序中,只需检查:
if (get_env('SCRIPT_RUN_ENV') != 'cron') {
echo "Program cannot be run manually\n";
exit(1);
}
现在,任何人都可以将其环境变量设置为该值并成功运行cron,但它应该停止琐碎的运行(或意外)......
但是请注意,任何可以在服务器上编辑环境变量的人都可以执行它,因此没有真正的方法可以从这个角度保护它(没有至少是自动化的)...还值得注意的是你无法通过HTTP注入环境变量。
答案 1 :(得分:4)
嗯,当它通过cron和web-server运行时,PHPSAPI的值应该有所不同。
答案 2 :(得分:3)
保护php cron作业的最佳方法是将php文件放在非public_html文件夹中。
例如:
您的信息页位于/home/myuser/public_html/test.php
将其移至/home/myuser/test.php
并加入了cron工作:
php -q /home/myuser/test.php
现在,没有用户可以从浏览器进入您的页面,只有cron作业可以使用它。
答案 3 :(得分:1)
不是某个匿名用户而是某个必须登录的人?
使用x.509客户端证书。