Alexandre
PHPПенсионер
собственно вопрос к Тони, как специалисту по модулям:
PHP 5.3.1 (cli) (built: May 21 2010 01:15:25)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
разрабатываю модуль обмена с noSQL БД. При использовании чтения из сокета в методе getTuple() возникает ошибка zend_mm_heap corrupted. В последствии использование сокета заменил на php_streams.Ошибка не исчезла.
Сделал иммитацию чтения, т.е. сделал метод getTupleMock() , работает все отлично.
исходники
Небольшое пояснение (test.php):
Метод select() - производит запрос к БД и читает заголовок ответа. Заголовок сохраняется в контексте модуля ( tarantool_object * ctx ).
Метод getTuple() читает из сокета один кортеж и возвращает его в в виде индексного массива array( 'a' , 'abc' , 1024 ... );
ошибка zend_mm_heap corrupted возникает при повторном вызове метода getTuple(); Тестирование производилось на данных из рекордсета с двумя кортежами.
Иммитация с использование mock методов (testLock.php)
метод selectMock() формирует данные заголовка и сохраняет их в контексте сервера. Вся логика метода select сохранена. Нет операций в/в с сокетами.
Метод getTupleMock() формирует данные одного кортежа, как буд-то они были прочитаны из сокета и возвращает его в в виде индексного массива array( 'a' , 'abc' , 1024 ... ); Вся логика работы метода getTuple сохранена. Заменены только операции работы с сокетом на предопределенные данные.
Работает нормально.
Тонни,
взгяни опытным взглядом, что я где забыл вставить или освободить?
Что может вызвать эту ошибку. По исходникам РНР - она может возникнуть в четырех или пяти разных случаях.
Ну и по ходу еще вопрос:
как правильно написать/вызвать функцию из метода (PHP_METHOD(tarantool_class, select)), в которой можно обрабатывать исключения. Если по конкретнее, не хочу дублировать кусок кода, который открывает соединение с БД (line 498-532), а вынести его в отдельную функцию.
Этот кусок будет присутствовать как минимум в 4х методах.
PHP 5.3.1 (cli) (built: May 21 2010 01:15:25)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
разрабатываю модуль обмена с noSQL БД. При использовании чтения из сокета в методе getTuple() возникает ошибка zend_mm_heap corrupted. В последствии использование сокета заменил на php_streams.Ошибка не исчезла.
Сделал иммитацию чтения, т.е. сделал метод getTupleMock() , работает все отлично.
исходники
Небольшое пояснение (test.php):
Метод select() - производит запрос к БД и читает заголовок ответа. Заголовок сохраняется в контексте модуля ( tarantool_object * ctx ).
Метод getTuple() читает из сокета один кортеж и возвращает его в в виде индексного массива array( 'a' , 'abc' , 1024 ... );
ошибка zend_mm_heap corrupted возникает при повторном вызове метода getTuple(); Тестирование производилось на данных из рекордсета с двумя кортежами.
Иммитация с использование mock методов (testLock.php)
метод selectMock() формирует данные заголовка и сохраняет их в контексте сервера. Вся логика метода select сохранена. Нет операций в/в с сокетами.
Метод getTupleMock() формирует данные одного кортежа, как буд-то они были прочитаны из сокета и возвращает его в в виде индексного массива array( 'a' , 'abc' , 1024 ... ); Вся логика работы метода getTuple сохранена. Заменены только операции работы с сокетом на предопределенные данные.
Работает нормально.
Тонни,
взгяни опытным взглядом, что я где забыл вставить или освободить?
Что может вызвать эту ошибку. По исходникам РНР - она может возникнуть в четырех или пяти разных случаях.
Ну и по ходу еще вопрос:
как правильно написать/вызвать функцию из метода (PHP_METHOD(tarantool_class, select)), в которой можно обрабатывать исключения. Если по конкретнее, не хочу дублировать кусок кода, который открывает соединение с БД (line 498-532), а вынести его в отдельную функцию.
Этот кусок будет присутствовать как минимум в 4х методах.