🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 概述 如果要在新请求开始时重置全局变量,则可以注册一个特殊的回调函数,该函数在每个请求的前面都会被调用 ### 回调类型 ``` // 如果要在调用函数之前初始化扩展中的其他变量 void onStartup(const std::function<void()> &callback); onRequest 方法,每次网页浏览/请求之前都会调用此回调 // 每次网页浏览/请求之前都会调用此回调 void onRequest(const std::function<void()> &callback); // 等待下一个请求 void onIdle(const std::function<void()> &callback); //PHP关闭之前立即被调用的回调 void onShutdown(const std::function<void()> &callback); ``` ## 示例 ### 设置扩展回调 <details> <summary>main.cpp</summary> ``` #include <phpcpp.h> #include <iostream> // 存储次数的全局变量 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" <<std::endl; // 重新初始化计数器 invokeDuringRequestCount = 0; }); extension.onStartup([](){ Php::out<< "onStartup" <<std::endl; }); extension.onIdle([](){ Php::out<< "onIdle" <<std::endl; }); extension.onShutdown([](){ Php::out<< "onShutdown" <<std::endl; }); extension.add("updateCounters", updateCounters); return extension; } } ``` </details> <br /> <details> <summary>main.php</summary> ``` <?php echo "1".PHP_EOL; updateCounters(); echo "2".PHP_EOL; updateCounters(); echo "3".PHP_EOL; //onStartup // onRequest // 1 // 2 // 3 // onIdle ``` </details> <br /> ### 设置 apache 如果在Apache 上运行,则在分支各种工作进程之前,将加载并初始化扩展,onStartup() 回调函数由父进程调用 最好不要在启动功能中执行将进程分叉到不同子进程(例如打开文件描述符) 不仅在Apache进程停止时调用onShutdown,而且在某个工作进程退出(因为不再需要该工作进程或因为它被新的新工作程序替换)而退出时,也将调用它。 ### 多线程 则应注意,全局(和静态!)变量也可以同时被多个线程访问,使用类似技术std::mutex或std::atomic 防止进行预防 如果扩展是针对多线程环境编译的,则PHP-CPP头文件将定义宏ZTS 重要准则 1. 不要使用全局变量 2. 只调用其他本机函数,而不回调PHP