【问题标题】:How to get generated content in Apache module and save it to file如何在 Apache 模块中获取生成的内容并将其保存到文件
【发布时间】:2023-02-01 15:52:24
【问题描述】:

我一直在玩 Apache 模块开发并让模块工作。但是,我遇到了在何处正确挂钩以获取我需要的所有数据的问题。

我正在制作一个简单的缓存模块,需要在请求开始时挂钩并检查磁盘上是否存在此 URL 的文件,如果存在,则为该文件提供服务并停止 Apache 的内容生成。

目前,该模块仍继续进入内容生成模式。假设我有一个需要 5 秒才能生成的长时间运行的 PHP 脚本。我会完全忽略调用脚本,只提供磁盘中的静态文件。

此外,如果本地文件不存在,我希望 Apache 执行内容生成(实际上执行 PHP 脚本)并且在将该数据发送到客户端之前我希望有一个适当的挂钩以某种方式获取这些数据并将其保存到本地文件。

我试过ap_hook_fixupsap_hook_handlerAPR_HOOK_LASTAPR_HOOK_LAST以及所有变体,但没有成功。

它总是在请求开始时执行。

我也不想使用任何现有的 Apache 模块。我希望这是一个独立的模块。

有没有办法做这种事情?

【问题讨论】:

    标签: c apache


    【解决方案1】:

    根据您提供的信息,听起来您希望模块先执行而不是最后执行。

    根据我对您的问题的了解,您想确保可能生成的文件是否已经在磁盘上,如果是,则提供该文件,而不是让您的 php 脚本提供它。

    在这种情况下,您需要使用 APR_HOOK_FIRSTAPR_HOOK_REALLY_FIRST 然后,假设你的文件在磁盘上,你提供你的文件,并在你的模块工作结束时做一个return OK;

    如果该文件不存在,请执行 return DECLINED

    DECLINED 告诉 Apache 你的模块不应该是这个请求的处理程序,并且会继续沿着模块列表向下直到它找到可以处理的东西。 这里的目标是让你的模块在 php 模块之前运行,以防止你的生成代码运行,并在找不到请求的文件时回退到 php 模块。

    笔记: APR_HOOK_? priorities are just numbers -10 到 30

    如果您发现您的模块执行得有点太快,您应该能够对此进行微调,例如在 mod_ssl 之前。

    另外,我很不擅长跟进文档,但是官方Apache module development docs 集齐了。请尝试使用它们,如果你有,

    在过去的 6 个月里,我一直在搞 Apache 模块开发,在电报机器人上工作。 我现在不得不做几次这首歌和舞蹈。

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 2012-02-02
      • 2015-06-28
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多