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

标签 php ajax wordpress ninja-forms

我目前正在尝试找出 2 个 Wordpress 插件之间的集成:WooCommerce Follow Up Emails 插件和 Ninja Forms 插件(最终目标是我们可以发送手动类型的后续电子邮件模板作为响应 ninja 表单提交的操作) )。我们正在使用 Ninja Forms 3,因为它物有所值。

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

问题是这样的:在每个页面上加载 ninja_forms_register_actions action 被调用,在此期间我实例化我的 action 类。期间__construct调用,我们填充操作的设置,为此,我们调用后续电子邮件 API。这将启动页面加载,在此期间 ninja_forms_register_actions行动被称为...

虽然我确实预料到了这个问题,但我计划的解决方案并没有帮助:也就是说,我计划使用 transient 来存储 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 服务器进程或其他类似删除/重命名插件文件夹的激烈操作,此时 transient 填充了 HTTP 错误代码(这本身并不奇怪)。很明显,我的 transient 解决方案不起作用,因为在请求之后 transient 仍然未设置。

在某些情况下,我会为 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 作业完成了这项工作 - 我们每十分钟获取一次模板列表,而不是根据需要,并将其存储在一个选项中。我不喜欢特别喜欢这个解决方案 - 但我还没有想出更好的解决方案。如果有此问题的通用解决方案,仍然感兴趣。

最佳答案

最后打印和第一个预期的 error_log 之间的方法/函数之一正在再次调用您的方法。要获得循环/递归开始的线索,您可以使用 debug_backtrace() 获取调用堆栈,从而获取循环/递归开始的点。

最好的开始位置是将 debug_backtrace 放在最后一个工作 error_log 之后。

关于php - 使用自己的 API 时防止无限 AJAX 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37381088/

相关文章:

javascript - Ajax 只播放音频文件一次

wordpress - 如何从 WP 模板中的插件调用函数?

wordpress - stdClass wordpress插件错误

php - 使用 Symfony/FosRestBundle/JMS Serializer 实现字段白名单的建议

php - jQuery Ajax更新MySQL数据库,但没有运行成功功能

javascript - Ajax 请求时出现 500 内部服务器错误。不确定问题的根源

mysql - 将解压缩输出重定向到 wp db import

php - 您如何拒绝在 PHP 中创建实例副本?

php - 使用 php 添加按钮

php - 如何使用 php xlsxwriter 从 mysql 导出 xlsx