扩展回调

最后更新于:2022-04-02 02:33:41

[TOC] ## 概述 如果要在新请求开始时重置全局变量,则可以注册一个特殊的回调函数,该函数在每个请求的前面都会被调用 ### 回调类型 ``` // 如果要在调用函数之前初始化扩展中的其他变量 void onStartup(const std::function &callback); onRequest 方法,每次网页浏览/请求之前都会调用此回调 // 每次网页浏览/请求之前都会调用此回调 void onRequest(const std::function &callback); // 等待下一个请求 void onIdle(const std::function &callback); //PHP关闭之前立即被调用的回调 void onShutdown(const std::function &callback); ``` ## 示例 ### 设置扩展回调
main.cpp ``` #include #include // 存储次数的全局变量 int invokeTotalCount = 0; // 全局变量,用于跟踪对象的次数 int invokeDuringRequestCount = 0; void updateCounters() { invokeTotalCount++; invokeDuringRequestCount++; } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension extension("my_extension", "1.0"); extension.onRequest([]() { Php::out<< "onRequest" <
main.php ```
### 设置 apache 如果在Apache 上运行,则在分支各种工作进程之前,将加载并初始化扩展,onStartup() 回调函数由父进程调用 最好不要在启动功能中执行将进程分叉到不同子进程(例如打开文件描述符) 不仅在Apache进程停止时调用onShutdown,而且在某个工作进程退出(因为不再需要该工作进程或因为它被新的新工作程序替换)而退出时,也将调用它。 ### 多线程 则应注意,全局(和静态!)变量也可以同时被多个线程访问,使用类似技术std::mutex或std::atomic 防止进行预防 如果扩展是针对多线程环境编译的,则PHP-CPP头文件将定义宏ZTS 重要准则 1. 不要使用全局变量 2. 只调用其他本机函数,而不回调PHP
';