Я написал расширение PHP 7.X для моей программы на C ++. Моя C ++ программа имеет среду Excelsior JET JNI, которая создается как статическая переменная в начале программы и освобождается в конце.
Потоки создаются средой выполнения JET, например, потоком GC, обработчиком слабых ссылокпоток, финализаторы и т. д. Я создаю потоки в PHP_MINIT_FUNCTION (extprog)
Эти потоки должны существовать в течение всего времени выполнения сценария php и закрываться в конце запроса PHP.
Чтобы обеспечить очистку потоков JET, я добавил метод освобождения в MSHUTDOWN_FUNCTION расширения PHP.
Проблема в том, что когда я запускаю расширение PHP в браузере, оно просто зависает. Если я удаляю код для управления потоками JET, PHP-скрипты запускаются, но не убивают потоки JET.
Как я могу управлять этими ресурсами между запросами? Есть ли способ сохранить глобальную переменную для ресурсов JET, которая поддерживает статическую переменную из кода C ++ между запросами?
Вот фрагмент кода C ++ для расширения PHP:
void php_saxonc_initialize(void){
if(SProcessor::jvmCreatedCPP == 0){
SProcessor::jvmCreatedCPP=1;
SProcessor::sxn_environ= (sxnc_environment *)malloc(sizeof(sxnc_environment));
/*
* First of all, load required component.
* By the time of JET initialization, all components should be loaded.
*/
SProcessor::sxn_environ->myDllHandle = loadDefaultDll ();
/*
* Initialize JET run-time.
* The handle of loaded component is used to retrieve Invocation API.
*/
initDefaultJavaRT (SProcessor::sxn_environ);
}
}
PHP_MINIT_FUNCTION(saxon)
{
php_saxonc_initialize();
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "SProcessor", SProcessor_methods);
....
Читая о глобальных расширениях PHP, мне кажется, я должен настроить все, используя глобальные переменные. Используя ZEND_BEGIN_MODULE_GLOBALS:
ZEND_BEGIN_MODULE_GLOBALS(saxon)
static sxnc_environment * sxn_environ;
php_saxonc_initialize();
ZEND_END_MODULE_GLOBALS(saxon)
ZEND_DECLARE_MODULE_GLOBALS(saxon)
Я не думаю, что это правильно, но не могу найти документацию для записи.