[PHP-users 24925] Re: OCI8 関数使用時にHTTPDプロセスのファイルディスクプリタが開放されない

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2005年 3月 16日 (水) 20:33:12 JST


こんにちわ、桝形です。

> PHPからOCI8関数を使用してOracleにアクセスを行ったところ、httpdプロセスが
> オープンしているファイルディスクプリタが開放されないという現象について質
> 問させてください。

過去ログに似たような報告があったような。。。
(解決したのかは不明)
http://ns1.php.gr.jp/pipermail/php-users/2004-October/023997.html


> 【環境/バージョン】
> 
> OS:Redhat Linux AS 2.1
> Webサーバ:Apache/1.3.31
> PHP:4.3.9

(関係ないと思いますが)PHPのバージョンを最新にしても同様でしょうか?

http://news.php.net/php.internals/15424

PHP 5.0.4RC1 source:
http://downloads.php.net/zeev/php-5.0.4RC1.tar.bz2
http://downloads.php.net/zeev/php-5.0.4RC1.tar.gz

PHP 4.3.11RC1 source:
http://downloads.php.net/ilia/php-4.3.11RC1.tar.bz2
http://downloads.php.net/ilia/php-4.3.11RC1.tar.gz



以前oci8.cソースを見た時に思ったのですが、PHP_FUNCTION(ocilogoff)
では実際には開放していないように思えました。
(詳しく調べていませんが、RSHUTDOWNではなくてMSHUTDOWNっぽい)


ApacheのRequestPerChildを低くしても現象は同じでしょうか?
(MaxRequestsPerChild 1とか)


http://cvs.php.net/co.php/php-src/ext/oci8/oci8.c?r=1.183.2.17&p=1


/* {{{ proto bool ocilogoff(int conn)
   Disconnect from database */

PHP_FUNCTION(ocilogoff)
{
#if 0
	this function does nothing any more. server-connections get automagiclly closed on 
	request-end. connection handles will "dissappear" as soon as they are no longer 
	referenced. as this module makes heavy use of zends reference-counting mechanism
	this is the desired behavior. it has always been a bad idea to close a connection that
	has outstanding transactions. this way we have a nice-clean approach.
	(thies @ thieso.net 20000110)

	oci_connection *connection;
	zval **conn;

	if (zend_get_parameters_ex(1, &conn) == FAILURE) {
		WRONG_PARAM_COUNT;
	}

	OCI_GET_CONN(connection,conn);

	connection->is_open = 0;

	zend_hash_apply(list, (apply_func_t) _stmt_cleanup TSRMLS_CC);

	if (zend_list_delete(connection->id) == SUCCESS) {
		RETURN_TRUE;
	} else {
		RETURN_FALSE;
	}
#endif
}

/* }}} */




PHP_RSHUTDOWN_FUNCTION(oci)
{
	oci_debug("START php_rshutdown_oci");

#if 0
	/* XXX free all statements, rollback all outstanding transactions */

	zend_hash_apply(OCI(user), (apply_func_t) _session_cleanup TSRMLS_CC);
	zend_hash_apply(OCI(server), (apply_func_t) _server_cleanup TSRMLS_CC);
#endif

	oci_debug("END   php_rshutdown_oci");

	return SUCCESS;
}


PHP_MSHUTDOWN_FUNCTION(oci)
{
	OCI(shutdown) = 1;

	oci_debug("START php_mshutdown_oci");

	zend_hash_apply(OCI(user), (apply_func_t)_session_pcleanup TSRMLS_CC);
	zend_hash_apply(OCI(server), (apply_func_t)_server_pcleanup TSRMLS_CC);

	zend_hash_destroy(OCI(user));
	zend_hash_destroy(OCI(server));

	free(OCI(user));
	free(OCI(server));

	CALL_OCI(OCIHandleFree(
				(dvoid *)OCI(pEnv), 
				OCI_HTYPE_ENV));

	oci_debug("END   php_mshutdown_oci");

	return SUCCESS;
}


なので「#if 0」部分を有効にすると何か変化はあるかもしれません。。。

--
Seiji Masugata<s.masugata @ digicom.dnp.co.jp>




PHP-users メーリングリストの案内