Я встраиваю PHP в свое приложение (написанное в Delphi 2010), используя компонент PHP4Delphi для взаимодействия с php5ts.dll.Я предполагаю, что моя программа действует как расширение для PHP (модуль sapi?), Поскольку она регистрирует некоторые функции и константы, которые могут использоваться в скриптах PHP ... в любом случае, хорошо работает при использовании простых типов данных, но когда я пытаюсь использовать многомерный массивв качестве возвращаемого значения я получаю ошибку
Access violation at address 01CD3C35 in module 'php5ts.dll'. Read of address 0231E608.
Список стеков
(000A2C35){php5ts.dll} [01CD3C35] destroy_op_array + $35
(004C4D61){myApp.exe } [008C5D61] php4delphi.TPHPEngine.ShutdownEngine (Line 1497, "php4delphi.pas" + 17) + $7
Строка 1497 в php4delphi.pas - это вызов tsrm_shutdown();
Для меня это выглядит как сбой сборщика мусора в конце скрипта, так что я подозреваю, что не правильно отправляю данные обратно в движок ... поэтому мой вопрос в том, как его отправитьмногомерные массивы обратно в PHP?
Я использую шаблон
var subArray: pzval;
_array_init(return_value, nil, 0);
for x := 0 to Data.Count-1 do begin
subArray := MAKE_STD_ZVAL;
_array_init(subArray, nil, 0);
// populate subarray with data, including other subarrays
...
// add subarray to the main array
add_index_zval(return_value, x, subArray);
end;
Должен ли я где-то "зарегистрировать" подмассивы, которые я создаю?Нужно ли увеличивать или уменьшать refcount
или устанавливать is_ref
?IOW, как должны быть настроены return_value и zvals подмассивов?
Я экспериментировал с добавлением 1 к refcount каждого массива (althought MAKE_STD_ZVAL уже инициализирует refcount к 1), и это лечит AV, но иногда приложение просто исчезает при выполнениисценарий - я подозреваю, что это вызывает бесконечную рекурсию в диспетчере памяти движка, приводит к сбою DLL-библиотеки php и взятию приложения вместе с ней ... При установке refcount в 0 (ноль; при условии, что когда в PHP-сценарии присваивается возвращаемое значение, его refcount будет1, а затем, когда переменная PHP выходит из области видимости, она будет уничтожена) все работает (т. Е. Без сбоев, без AV), но сценарий не будет генерировать какой-либо вывод, просто пустой HTML-файл ...
Iтакже отправьте данные в виде массивов в мою функцию, затем используйте zend_hash_find
, zend_hash_get_current_data
и т. д. для чтения данных.Может ли это испортить пересчет переменных?Т.е. мне нужно уменьшить refcout переменной, возвращаемой zend_hash_find
, когда я закончу с ней?
И безопасно ли повторно использовать эту же переменную при итерации по массиву, т.е.
var Val: pppzval;
new(Val);
zend_hash_internal_pointer_reset(aZendArr^.value.ht);
for x := 1 to zend_hash_num_elements(aZendArr^.value.ht) do begin
zend_hash_get_current_data(aZendArr^.value.ht, Val);
// read data from Val to local variable and do something with it
zend_hash_move_forward_ex(aZendArr^.value.ht, nil);
end;
Dispose(Val);
или каждая итерация цикла должна создавать / освобождать Val?
TIA
ain