【问题标题】:TYPO3 Scheduler does nothingTYPO3 调度程序什么都不做
【发布时间】:2017-02-15 16:39:48
【问题描述】:

我写了一个调度任务。它在我的加工中工作正常。不幸的是,它不能在我的远程机器上运行。

这台机器是运行php7.0 php-fpm 的freeBSD。 cron 看起来像:

**MAILTO=mail@falk-roeder.de
@weekly /usr/local/bin/letsencrypt.sh -c
* * * * * php /var/www/alpha/beta/gamma/typo3/cli_dispatch.phpsh scheduler
#* * * * * php -r 'echo function_exists("foo") ? "yes" : "no";'

最后一个 crontab 被执行(如果我评论它)并将邮件输出发送给我。

如果我用奇怪的东西替换“调度程序”,我还会收到一封邮件,其中包含我应该选择的有效选项。 所以这对我来说意味着 cron 正在运行并且 cli_dispatch.phpsh 被正确调用。

在 TYPO3 后端,调度程序说配置很好。我可以手动启动 cron 并让它完成这项工作。

那么,还有什么原因……?

编辑

我发现原因是 TYPO3 调度程序没有请求正确的数据库。我有一个 AdditionalConfiguration 文件,其中 $GLOBALS['TYPO3_CONF_VARS']['DB']['database'] 中的数据库名称根据变量 $_SERVER['SERVER_NAME'] 进行了更改。但是在调度器中这个变量是空的。所以我不得不删除 AdditionalConfiguration 文件,一切都按预期工作。

现在的问题是,如何实现Scheduler根据Servername获取正确的Database?

【问题讨论】:

    标签: php cron scheduler typo3-7.6.x


    【解决方案1】:

    最好使用应用程序上下文而不是检查服务器变量,这也可以在调用调度程序时设置

    【讨论】:

    • 丹克。 Das ist perfekt.
    【解决方案2】:

    对于其他更完整的答案:

    在 .htaccess 中,您可以根据 youtr 主机名设置站点的应用程序上下文。

    例子:

    # Rules to set ApplicationContext based on hostname
    RewriteCond %{HTTP_HOST} ^dev\.example\.de$
    RewriteRule .? - [E=TYPO3_CONTEXT:Development]
    RewriteCond %{HTTP_HOST} ^alpha\.example\.de$
    RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]
    RewriteCond %{HTTP_HOST} ^www\.example\.de$
    RewriteRule .? - [E=TYPO3_CONTEXT:Production]
    

    在您的 AdditionalConfiguration.php 中,您基于此上下文设置数据库。 示例:

    if (\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext()->isDevelopment()) {
        $GLOBALS['TYPO3_CONF_VARS']['DB']['database'] = 'typo376_dev';
        $GLOBALS['TYPO3_CONF_VARS']['DB']['username'] = 'typo376_dev_usr';
        $GLOBALS['TYPO3_CONF_VARS']['DB']['password'] = 'somepw';
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['clearCacheSystem'] = '1';
    } elseif (\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext() == 'Production/Staging') {
        $GLOBALS['TYPO3_CONF_VARS']['DB']['database'] = 'typo376_alpha';
        $GLOBALS['TYPO3_CONF_VARS']['DB']['username'] = 'typo376_alpha_usr';
        $GLOBALS['TYPO3_CONF_VARS']['DB']['password'] = 'someotherpw';
    } else if(\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext() == 'Production') {
        $GLOBALS['TYPO3_CONF_VARS']['DB']['database'] = 'typo376';
        $GLOBALS['TYPO3_CONF_VARS']['DB']['username'] = 'typo376_usr';
        $GLOBALS['TYPO3_CONF_VARS']['DB']['password'] = 'someotherpw';
    

    }

    在您的 cron 选项卡中(在命令行上使用 crontab -e 编辑它),您在调用 cliscript 之前设置环境变量。

    例子:

    * * * * * TYPO3_CONTEXT=Production/Staging php /var/www/alpha/beta/gamma/typo3/cli_dispatch.phpsh scheduler
    

    【讨论】:

    • 重要的旁注:上下文测试只能用于测试,即单元测试、功能测试。在 QS 等环境中使用开发或生产的子上下文(如生产/测试)!
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 2011-03-24
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多