如何让用 C++ 编写的 PHP 扩展记住全局变量?

Cha*_*lie 0 php c++ apache php-cpp

我正在使用PHP-CPP库来开发 PHP 扩展。

当我在 C++ 中尝试以下操作时:

#include <phpcpp.h>

static int number=0;

Php::Value get_num()
{
    number++;
    return number;
}
Run Code Online (Sandbox Code Playgroud)

PHP 中的以下内容:

<?php
    echo get_num();
?>
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作一段时间,但随后“number”变量随机重置为零。另外,在 Firefox 中按 CTRL+F5,“number”变量会再次重置为零。

如何避免“数字”被重置?

小智 5

PHP 扩展中的全局 C++ 变量不是持久的。

这完全取决于您的网络服务器的设置。例如,如果您使用 Apache(大多数其他人都有类似的设置),则有多个 Web 服务器进程实例正在运行,所有实例都提供页面浏览服务。每个实例都有自己的全局“number”变量。这就是为什么您没有看到数字按预期增加的原因:并非每个页面浏览量都由同一个 Apache 实例提供。

最重要的是:当网络服务器的负载上升或下降时,新的 Apache 进程将启动和停止,并创建新的“数字”变量,初始值为 0。此外,Apache 进程通常会在一定时间后重新启动。固定数量的页面浏览量(在 apache 配置文件中设置),这也会将计数器设置回零。

在您自己的小型测试环境中,您不会那么快遇到这个问题,因为负载非常低,以至于可以通过单个 Web 服务器实例来处理,但在实时繁忙的服务器上您肯定会遇到这种情况。

如果您想使用持久计数器,则必须将其存储在其他位置,例如文件或数据库中。