Как я могу сделать мое расширение PHP, запрограммированное в C++, помнить глобальные переменные?

Я использую библиотеку PHP-CPP для разработки расширений PHP.

Когда я пытаюсь следующее в C++:

#include <phpcpp.h>

static int number=0;

Php::Value get_num()
{
    number++;
    return number;
}

И следующее в PHP:

<?php
    echo get_num();
?>

Некоторое время все работает, как и ожидалось, но затем переменная "число" случайно сбрасывается обратно в ноль. Кроме того, нажимая CTRL+F5 в Firefox, переменная "число" снова сбрасывается в ноль.

Как избежать сброса "числа"?

2 ответа

Глобальная переменная C++ в расширении PHP не является постоянной.

Все зависит от настроек вашего веб-сервера. Если вы, например, используете Apache (и большинство других имеют аналогичную настройку), есть несколько запущенных процессов веб-сервера, все из которых просматривают страницы. Каждый из этих экземпляров имеет свою собственную глобальную переменную "число". Вот почему вы не видите увеличения числа, как вы ожидали: не каждый просмотр страницы обслуживается одним и тем же экземпляром Apache.

Кроме того: когда нагрузка на ваш веб-сервер повышается или понижается, новые процессы Apache запускаются и останавливаются, а новые переменные 'number' создаются с начальным значением 0. Кроме того, процесс Apache обычно перезапускается после определенного периода времени. фиксированное количество просмотров страниц (устанавливается в файле конфигурации apache), при котором счетчик также обнуляется.

В вашей небольшой тестовой среде вы не столкнетесь с этой проблемой слишком быстро, потому что нагрузка настолько мала, что она может быть обработана одним экземпляром веб-сервера, но на занятом сервере вы наверняка столкнетесь с этим.

Если вы хотите использовать постоянный счетчик, вам придется хранить его где-то еще, например, в файле или базе данных.

вам следует использовать Mutex для отключения доступа к общему ресурсу из многопоточности

Другие вопросы по тегам