Обмен данными с zend (многомерные массивы)

Я встраиваю PHP в свое приложение (написано в Delphi 2010), используя компонент PHP4Delphi для взаимодействия с php5ts.dll. Я предполагаю, что моя программа действует как расширение для PHP (модуль sapi?), Поскольку она регистрирует некоторые функции и константы, которые могут использоваться в сценариях PHP ... в любом случае, хорошо работает при использовании простых типов данных, но когда я пытаюсь использовать многомерный массив в качестве возвращаемого значения я получаю ошибку

Нарушение прав доступа по адресу 01CD3C35 в модуле 'php5ts.dll'. Чтение адреса 0231E608.
Список стека
(000A2C35) {php5ts.dll} [01CD3C35] destroy_op_array + $ 35
(004C4D61) {myApp.exe} [008C5D61] php4delphi.TPHPEngine.ShutdownEngine (Line 14 "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 и zvalue подмассивов?
Я экспериментировал с добавлением 1 к refcount каждого массива (хотя MAKE_STD_ZVAL уже инициализирует refcount равным 1), и это лечит AV, но иногда приложение просто исчезает при выполнении сценария - я подозреваю, что это вызывает бесконечную рекурсию в диспетчере памяти движка, сбой библиотеки php DLL и забирая приложение с собой ... При установке refcount на 0 (ноль; при условии, что когда возвращаемое значение присваивается в сценарии PHP, refcount будет 1, а затем, когда переменная PHP выйдет за пределы области видимости, она будет уничтожена), все, похоже, работает (то есть без сбоев, без AV ), но сценарий не будет генерировать никакого вывода, просто пустой файл html ...

Я также отправляю данные в виде массивов в свою функцию, затем использую 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

22
задан Sam 14 July 2011 в 16:01
поделиться