在处理请求后是否可以从 VCL 调用模块函数?

Is it possible from VCL to invoke a module function after a request has been processed?

理想情况下,我想做这样的事情:

sub vcl_after_response_is_sent {
  mymod.f(req, resp);
}

但我没有看到任何 builtin subroutine 可以让你这样做。还有其他方法可以实现吗?

这可以使用 PRIV_TASK 的免费功能来完成。

在模块的VCC中声明函数如下:

$Function VOID f(PRIV_TASK)

对函数的定义使用如下内容:

void finish_request(void*) {
}

VCL_VOID vmod_trace_request(VRT_CTX, struct vmod_priv* priv_task) {
  priv_task->priv = /* Some non-null value */
  priv_task->free = finish_request;
}

如果 f 然后从 vcl_recv

调用
sub vcl_recv {
  mymod.f();
}

finish_request 将在 varnish 完成请求时调用。