Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: ODBC хочет очень много памяти при повторном запросе.
Форумы портала PHP.SU » » Работа с СУБД » ODBC хочет очень много памяти при повторном запросе.

Страниц (1): [1]
 

1. Diozan - 16 Июля, 2015 - 11:21:22 - перейти к сообщению
Суть вопроса такова. Имеется база данных Fiurebird 1.5 на сервере под Windows XP.
Далее, имеется сервер, в котором она подсоединена в unixODBC.
Сервер Gentoo, PHP-5.6.9, unixODBC-2.3.2
Имеется скрипт на PHP, который подключается к этой базе данных, делает выборку, записывает её в файл. Всё просто. Но понадобилось нарастить функциональность, для чего потребовалось ещё одно обращение к этой БД. Вот тут-то и началось. При втором обращении выпадает и кричит, что мало памяти.
Для демонстрации этого эффекта был написан скрипт...

CODE (htmlphp):
скопировать код в буфер обмена
  1. #!/usr/bin/php
  2.  
  3. <?php
  4.  
  5. # Устанавливаем системные переменные
  6. date_default_timezone_set("Europe/Moscow");
  7. setlocale (LC_ALL, "ru_RU.WIN1251");
  8.  
  9. # Подключаемся к базе данных
  10. $odbc_header = odbc_connect("acs", "", "");
  11.  
  12. # Формируем и выполняем 1-й запрос на получение информации
  13. $odbc_query = "select distinct DEPARTMENT from PERSONNEL";
  14. $odbc_result = odbc_prepare($odbc_header, $odbc_query);
  15. odbc_execute($odbc_result);
  16.  
  17. # Построчно обрабатываем полученные из базы данных записи и выводим их
  18. while ($pers_info = odbc_fetch_array($odbc_result)) echo $pers_info["DEPARTMENT"]."\n";
  19.  
  20. # Переподключаемся к базе данных
  21. #odbc_close($odbc_header);
  22. #$odbc_header = odbc_connect("acs", "", "");
  23. # Формируем и выполняем 2-й запрос на получение информации
  24. $odbc_query = "select distinct FIRMA from PERSONNEL";
  25. $odbc_result = odbc_prepare($odbc_header, $odbc_query); # Здесь обваливается...
  26. odbc_execute($odbc_result);
  27.  
  28. # Построчно обрабатываем полученные из базы данных записи и выводим их
  29. while ($pers_info = odbc_fetch_array($odbc_result)) echo $pers_info["FIRMA"]."\n";
  30.  
  31. odbc_free_result($odbc_result);
  32. odbc_close($odbc_header);
  33.  
  34. ?>


Первая выборка идёт нормально, я получаю список номеров подразделений, а вот вторая выборка обрушивает скрипт.

CODE (htmlphp):
скопировать код в буфер обмена
  1. 9
  2. 90
  3. 91
  4. 92
  5. 93
  6. 94
  7. PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 13684237551378890813 bytes) in /root/server_config/europa/test/test.crash.php on line 26
  8.  
  9. Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 13684237551378890813 bytes) in /root/server_config/europa/test/test.crash.php on line 26
  10. Press any key to continue...


Причём не зависимо от того, производилось переподключение к базе данных или нет. Результат одинаковый.

Видно, что не хватает памяти для этого, в общем-то, простейшего скрипта. Но то количество, которое запрашивается, впечатляет, не уверен, что столько памяти было вообще выпущено во всём мире.

На всякий случай, параметры unixODBC

CODE (htmlphp):
скопировать код в буфер обмена
  1. /etc/unixODBS/odbc.ini
  2.  
  3. [acs]
  4. Description = Firebird
  5. Driver = Firebird
  6. Dbname = 172.16.77.33:C:\ACS\Base\ACS.FDB
  7. User = WEB
  8. Password = ******
  9. Role =
  10. CharacterSet = WIN1251
  11. ReadOnly = Yes
  12. NoWait = No
  13.  
  14.  
  15. /etc/unixODBC/odbcinst.ini
  16.  
  17. [Firebird]
  18. Description = Firebird ODBC Driver
  19. Driver = /usr/lib/libOdbcFb.so
  20. Setup = /usr/lib/libOdbcFb.so
  21. Threading = 1
  22. FileUsage = 1
  23. CPTimeout =
  24. CPReuse =


Есть ли какие-то мысли?
2. Sail - 16 Июля, 2015 - 12:36:25 - перейти к сообщению
Diozan пишет:
Есть ли какие-то мысли?

Как вариант, пишут, что падает с такой ошибкой, если возвращается NULL в наборе данных.
Рекомендуют использовать нечто вроде ifnull(fieldname, '') /или какая подобная функция в ib?/.
3. Diozan - 16 Июля, 2015 - 14:02:13 - перейти к сообщению
Увы нет. Сейчас перестроил запрос на выдачу одного, конкретного значения, и всё равно такая же бяка...

 

Powered by ExBB FM 1.0 RC1