PHP извикването на oci_execute() води до дъмп на ядрото

Написах скрипт, който прави няколко много прости неща:

1) Свързва се с база данни на Oracle 10.
2) Проверява дали съществува tmp таблица.
3) Ако !exist, създава tmp таблица (копие на съществуваща таблица)
4) I направете известна манипулация на данни в 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() преди? Аз съм малко на загуба по този въпрос.


person Nicholas Kreidberg    schedule 16.02.2011    source източник


Отговори (1)


След много блъскане на главата разбрах проблема, благодарение на gdb. В системата, която изпълнявах, този скрипт от PHP беше изграден срещу различни библиотеки на Oracle, отколкото към които се свързваше, следователно имаше несъответствие, което причини дъмпа на ядрото. Той се свързва с библиотеките на oracle 9, когато е изграден срещу 10g.

Ето изхода от gdb: [gdb /opt/bin/php core]

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 libs.

Във всеки случай всичко е наред и скриптът работи според очакванията.

person Nicholas Kreidberg    schedule 17.02.2011