使用自己的API时防止无限的AJAX循环

时间:2016-05-23 00:33:58

标签: php ajax wordpress ninja-forms

我目前正试图找出2个Wordpress插件之间的集成:WooCommerce跟进电子邮件插件和Ninja Forms插件(最终目标是我们可以发送手动型后续电子邮件模板作为响应的动作忍者表格提交)。我们正在使用Ninja Forms 3,这是值得的。

定义Action class的选项时,我向用户提供模板列表,以便在定义操作时可以选择要发送的模板。要从后续电子邮件插件中获取电子邮件模板,我使用的是API client,特别是get_emails()方法(反过来,转换为对/emails端点的GET调用他们的API网址。)

问题在于:在每个页面加载时调用ninja_forms_register_actions动作,在此期间我实例化我的动作类。在__construct调用期间,我们会填充操作的设置,为此,我们会调用Follow Up Emails API。这会启动页面加载,在此期间会调用ninja_forms_register_actions操作...

虽然我确实预料到了这个问题,但我计划的解决方案没有帮助:也就是说,我计划使用瞬态来存储API调用的结果,如下所示:

private static function _get_templates()
    {
        error_log('_get_templates() started - ' . microtime(true));
        if (false === ($templates = get_transient(self::TEMPLATE_TRANSIENT))) {
            error_log('_get_templates() fetching - ' . microtime(true));
            $fue_api = self::fue_api();
            $templates = $fue_api->get_emails();
            set_transient(self::TEMPLATE_TRANSIENT, $templates, self::TEMPLATE_TRANSIENT_EXPIRY);
            error_log('_get_templates() fetched - ' . microtime(true));
        }
        error_log('_get_templates() done - ' . microtime(true));

        return $templates;
    }

然而,我的日志中的结果如下:

[22-May-2016 23:53:33 UTC] _get_templates() started - 1463961213.692187
[22-May-2016 23:53:33 UTC] _get_templates() fetching - 1463961213.694222
[22-May-2016 23:53:34 UTC] _get_templates() started - 1463961214.05998
[22-May-2016 23:53:34 UTC] _get_templates() fetching - 1463961214.061054
[22-May-2016 23:53:38 UTC] _get_templates() started - 1463961218.660683
[22-May-2016 23:53:38 UTC] _get_templates() fetching - 1463961218.661265
[22-May-2016 23:53:40 UTC] _get_templates() started - 1463961220.772228
[22-May-2016 23:53:40 UTC] _get_templates() fetching - 1463961220.774142
[22-May-2016 23:53:41 UTC] _get_templates() started - 1463961221.150277
[22-May-2016 23:53:41 UTC] _get_templates() fetching - 1463961221.654757
[22-May-2016 23:53:45 UTC] _get_templates() started - 1463961225.306565
[22-May-2016 23:53:45 UTC] _get_templates() fetching - 1463961225.308898
[22-May-2016 23:53:46 UTC] _get_templates() started - 1463961226.281794
[22-May-2016 23:53:46 UTC] _get_templates() fetching - 1463961226.283803

直到我杀死Web服务器进程或其他类似于删除/重命名插件文件夹的其他内容,此时瞬态填充了HTTP错误代码(这本身并不令人惊讶)。很明显,我的瞬态解决方案不起作用,因为在请求之后瞬态仍未设置。

在某些情况下,我会为DOING_AJAX添加一个检查,但这不符合两个原因 - 我仍然需要这些数据可用于Ninja Forms AJAX流程,而且我不是确定DOING_AJAX是否实际设置在这里,因为FUE API不使用admin-ajax.php。我正在考虑换成以下内容:

private static function _get_templates()
        {
            error_log('_get_templates() started - ' . microtime(true));
            if (false === get_option(self::TEMPLATE_LOCK_OPTION, false) && false === ($templates = get_transient(self::TEMPLATE_TRANSIENT))) {
                delete_option(self::TEMPLATE_LOCK_OPTION);
                add_option(self::TEMPLATE_LOCK_OPTION, true, '', 'no');
                error_log('_get_templates() fetching - ' . microtime(true));
                $fue_api = self::fue_api();
                $templates = $fue_api->get_emails();
                delete_option(self::TEMPLATE_LOCK_OPTION);
                set_transient(self::TEMPLATE_TRANSIENT, $templates, self::TEMPLATE_TRANSIENT_EXPIRY);
                error_log('_get_templates() fetched - ' . microtime(true));
            }
            error_log('_get_templates() done - ' . microtime(true));

            return $templates;
        }

但是使用选项作为锁感到肮脏和错误,我觉得它在使用对象缓存时会留下错误的空间(例如WPEngine等)。有没有更好/正常的方法来解决这个问题,或者,上面没有真正的问题?

编辑:所以锁定解决方案也不能100%运行 - 我最终用WP Cron作业完成了这项工作 - 每隔十分钟我们获取模板列表,而不是根据需要,并将其存储在选项。我不喜欢特别喜欢这个解决方案 - 但我还没有能够提出一个更好的解决方案。如果这个问题有一个共同的解决方案,仍然感兴趣。

2 个答案:

答案 0 :(得分:0)

最后一次打印到第一个预期的error_log之间的方法/功能之一正在再次调用您的方法。要了解循环/递归开始的位置,您可以使用debug_backtrace()来获取调用堆栈,从而了解循环/递归开始的位置。

最好的开始方法是将debug_backtrace放在最后一个错误日志之后。

答案 1 :(得分:0)

以下一些函数调用 _get_templates()

$fue_api = self::fue_api();
$templates = $fue_api->get_emails();
delete_option(self::TEMPLATE_LOCK_OPTION);
set_transient(self::TEMPLATE_TRANSIENT, $templates, self::TEMPLATE_TRANSIENT_EXPIRY);