Как я могу сделать мое расширение 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 для отключения доступа к общему ресурсу из многопоточности