Как разделить статическую переменную C ++ между запросами PHP в расширении PHP - PullRequest
0 голосов
/ 05 ноября 2019

Я написал расширение 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)

Я не думаю, что это правильно, но не могу найти документацию для записи.

...