|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-01-13 10:33 UTC] martin dot pala at oskar dot cz
Description: ------------ We are running PHP-5.0.3 and Apache-1.3.31 on Solaris 9. There is application written in PHP which is able to crash PHP anytime specific script which is using OCI extension is called. The backtrace is: ---8<--- core 'core' of 18430: /usr/apache/bin/httpd fd8c038c _oci_close_session (636978, 15, ffbff014, fdcc2240, fdcc222c, 636978) + 9c fd9d7900 list_entry_destructor (5d93c8, 75c00, 10, 2654f0, 0, 252a0) + 74 fd9d657c zend_hash_apply_deleter (fdcc65d0, 6bae80, 10, 5ad1cba6, 2654c0, 238710) + 194 fd9d6604 zend_hash_graceful_reverse_destroy (fdcc65d0, fd9c0540, 0, 0, 0, 0) + 14 fd9c14ec shutdown_executor (0, fd9ce650, 0, 0, 0, 0) + 2b8 fd9ce6a0 zend_deactivate (fdcc6c34, fd990e30, 0, ffbff578, 0, 0) + bc fd990ed4 php_request_shutdown (0, fda0e308, 0, ffbff578, 0, 0) + 258 fda0e39c apache_php_module_main (ffffffff, 0, 0, ffbff658, 0, 0) + 158 fda0ee7c send_php (ffffffff, 0, 0, 0, 0, 0) + 334 fda0f0f8 send_parsed_php (258428, fdbb1aa7, ffffffff, 0, 70, 70) + 18 0001c090 ap_invoke_handler (258428, 25, 1, 6fc00, 25b438, 6) + f8 0002fd6c ???????? (258428, fe2f0148, 1, ffbff8e4, 4, 1) 0002fdbc ap_process_request (258428, 4, 258428, ffbff964, ffbff954, 2) + 28 00027be8 ???????? (77c00, 77c00, 77c00, 10, 6fc00, 26000) 00027df8 ???????? (7aa28, 2, 41e27c3a, 0, ffbffa40, 0) 00027eb4 ???????? (4, 0, 41e27c39, 0, 1, 76d68) 00028714 ???????? (77c00, 77c00, 77c00, 8, 0, 6fc00) 00028dd8 main (1, ffbffbbc, ffbffbc4, 6fc00, 0, 0) + 34c 00017a70 _start (0, 0, 0, 0, 0, 0) + 108 ---8<--- I have tried latest PHP snapshot too - with the same result. I tried then run Apache in single-process mode (using -X option). This time it was stable. Thereafter i found in the code of OCI extension (ext/oci8/oci8.c) the dependency of OCI library initialization flag OCI_THREADED on PHP ZTS option -> ZTS is not enabled (nor recommended) by default, thus PHP omits this flag during initialization. I tried then to change the OCI extension code to use this flag by default using the patch bellow - the problem was solved, apache in multi-process mode didn't failed anymore on the PHP script. Patch: ---8<--- diff -Naur php-5.0.3/ext/oci8/oci8.c php-5.0.3-mp/ext/oci8/oci8.c --- php-5.0.3/ext/oci8/oci8.c 2004-11-22 22:46:49.000000000 +0100 +++ php-5.0.3-mp/ext/oci8/oci8.c 2005-01-11 14:20:56.802128000 +0100 @@ -622,11 +622,7 @@ #endif -#ifdef ZTS #define PHP_OCI_INIT_MODE PHP_OCI_INIT_MODE_TMP | OCI_THREADED -#else -#define PHP_OCI_INIT_MODE PHP_OCI_INIT_MODE_TMP -#endif mutex_alloc(mx_lock); ---8<--- It seems that to allow to run PHP OCI extension in apache multi-process mode it is required to initialize the OCI library with OCI_THREADED flag, otherwise PHP may cause apache to crash. There are several other unresolved bugreports in bugs.php.net database related to this combination (solaris + apache + php-4.x/php-5.x) and crash in _oci_close_session(). The default initialization with OCI_THREADED should not hurt any functionality and it seems it solves the problem. PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 06 19:00:01 2025 UTC |
We have moved our application to linux (Redhat EL3), it is more stable then on solaris, however the problem persist. Current configuration is PHP-5.0.4 + Apache-2.0.46 + OCI instant client 10.1.0.3. We now see the same crashes in OCI as on solaris. It happens when the child wants to gracefuly exit in _oci_close_session: --8<-- (gdb) bt #0 0x015898f0 in kpufhndl0 () from /usr/lib/oracle/10.1.0.3/client/lib/libclntsh.so.10.1 #0 0x015898f0 in kpufhndl0 () from /usr/lib/oracle/10.1.0.3/client/lib/libclntsh.so.10.1 #1 0x015898a8 in kpufhndl () from /usr/lib/oracle/10.1.0.3/client/lib/libclntsh.so.10.1 #2 0x015fa043 in OCIHandleFree () from /usr/lib/oracle/10.1.0.3/client/lib/libclntsh.so.10.1 #3 0x0111c83a in _oci_close_session (session=0x1f78510) at /usr/src/redhat/BUILD/php-5.0.4/ext/oci8/oci8.c:3007 #4 0x011f54ff in list_entry_destructor (ptr=0xb6a0bc24) at /usr/src/redhat/BUILD/php-5.0.4/Zend/zend_list.c:178 #5 0x011f4248 in zend_hash_apply_deleter (ht=0xb69fe404, p=0xb69fe434) at /usr/src/redhat/BUILD/php-5.0.4/Zend/zend_hash.c:574 #6 0x011f42ec in zend_hash_graceful_reverse_destroy (ht=0x1407754) at /usr/src/redhat/BUILD/php-5.0.4/Zend/zend_hash.c:640 #7 0x011e3fd6 in shutdown_executor () at /usr/src/redhat/BUILD/php-5.0.4/Zend/zend_execute_API.c:283 #8 0x011edaf4 in zend_deactivate () at /usr/src/redhat/BUILD/php-5.0.4/Zend/zend.c:817 #9 0x011b8b66 in php_request_shutdown (dummy=0x0) at /usr/src/redhat/BUILD/php-5.0.4/main/main.c:1216 #10 0x01216fc7 in php_handler (r=0xb72eb030) at /usr/src/redhat/BUILD/php-5.0.4/sapi/apache2handler/sapi_apache2.c:590 #11 0x080685c5 in ap_run_handler () #12 0x08068bdf in ap_invoke_handler () #13 0x08065266 in ap_process_request () #14 0x080608bc in _start () #15 0xb72eb030 in ?? () #16 0x00000004 in ?? () #17 0xb72eb030 in ?? () #18 0x080722dc in ap_run_pre_connection () #19 0x08072195 in ap_run_process_connection () #20 0x08066ae1 in ap_graceful_stop_signalled () #21 0x08066c34 in ap_graceful_stop_signalled () #22 0x08066ed9 in ap_graceful_stop_signalled () #23 0x08067570 in ap_mpm_run () #24 0x0806da4f in main () --8<-- It seems that the session context was damaged: --8<-- (gdb) frame 3 #3 0x0111c83a in _oci_close_session (session=0x1f78510) at /usr/src/redhat/BUILD/php-5.0.4/ext/oci8/oci8.c:3007 3007 ); (gdb) print session $14 = (oci_session *) 0x1f78510 (gdb) print *session $15 = {num = 11990016, persistent = 0 '\0', is_open = 0 '\0', exclusive = 0 '\0', thread = 0 '\0', sessions_list = 0x0, server = 0x1a6eac6, pSession = 0x1882cae, pEnv = 0x1d40c08, charsetId = 51142} (gdb) print *session->server $16 = {num = -2081649835, persistent = 2106149100, is_open = -864712248, dbname = 0x8b08458b <Address 0x8b08458b out of bounds>, pServer = 0x4d8b0c55} --8<-- => it seems that the problem affects all systems, the session context gets somehow corrupted. Martin