PHP вызов oci_execute () приводит к дампу ядра - PullRequest
0 голосов
/ 16 февраля 2011

Я написал скрипт, который делает несколько очень простых вещей:

1) Подключается к базе данных Oracle 10.2) Проверяет, существует ли таблица tmp.3) Если существует, создает таблицу tmp (копия существующей таблицы)4) Я делаю некоторые манипуляции с данными в таблице tmp (чтобы смоделировать, что произойдет в производстве)5) Выполнен запрос, чтобы получить разницу между двумя таблицами, и именно здесь я сталкиваюсь с проблемами.Проблемный блок кода находится ниже с конкретной функцией, имеющей звездочки до и после нее.

printf("  Finding difference between current and previous data .......");
$sCmd = sprintf("SELECT * FROM hrms_mview_previous WHERE cstatus='A' MINUS SELECT * FROM hrms_mview_current");
if (!($hDB_Results = oci_parse($hDB, $sCmd)))
{
  fprintf(STDERR, "ERROR\n  Error in MINUS query.\n\n");
  exit(1);
}
else
{
  **oci_execute($hDB_Results);**
  $iRows = oci_fetch_all($hDB_Results, $aRes);
  print_r($aRes);
  printf("done\n");
}

oci_free_statement($hDB_Results);

Если я удаляю вызов oci_execute (), код выполняет штраф и возвращается пустой массив.Если я выполняю тот же запрос, который передается oci_execute () в Oracle CLI, запрос работает нормально и возвращает ожидаемые данные.

Это вывод сценария:

Segmentation fault (core dumped)

Я использую версию PHP 5.2.13 на машине Solaris.Кто-нибудь испытывал подобное поведение с вызовами oci_execute () раньше?Я немного растерялся.

1 Ответ

1 голос
/ 17 февраля 2011

После долгих ударов головой я понял проблему благодаря gdb. В системе, в которой я запускал этот скрипт из PHP, он был создан для библиотек Oracle, отличных от тех, на которые он ссылался, поэтому возникло несоответствие, которое вызвало дамп ядра. Он был связан с библиотеками oracle 9 при сборке 10g.

Вот вывод из gdb: [ядро gdb / opt / bin / php]

Core was generated by `/opt/bin/php ./dbupdate_wfterm.php'.
Program terminated with signal 11, Segmentation fault.
#0  0xff050938 in memcpy () from /platform/SUNW,Sun-Fire-V490/lib/libc_psr.so.1
(gdb) backtrace
#0  0xff050938 in memcpy () from /platform/SUNW,Sun-Fire-V490/lib/libc_psr.so.1
#1  0xfdf5feac in nioqrc () from /opt/oracle/9.2.0/9.2.0/lib/libclntsh.so.9.0
#2  0xfe0ee0d0 in ttcdrv () from /opt/oracle/9.2.0/9.2.0/lib/libclntsh.so.9.0
#3  0xfdf6975c in nioqwa () from /opt/oracle/9.2.0/9.2.0/lib/libclntsh.so.9.0
#4  0xfdd61c40 in upirtrc () from /opt/oracle/9.2.0/9.2.0/lib/libclntsh.so.9.0
#5  0xfdd61c40 in upirtrc () from /opt/oracle/9.2.0/9.2.0/lib/libclntsh.so.9.0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Как вы можете видеть, он ссылался на библиотеки 9.2.0, когда он должен использовать библиотеки 10g.

С любой скоростью все в порядке, и скрипт работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...