PHP Extension Memory Problems

php.internals

Bruce Bailey

22 years ago
I have two problems with a PHP extension that I wrote that creates PHP arrays. 1) If I call my extension function that creates PHP arrays and returns them, unless I either ‘unset’ or assign it to the empty string the process acts like there is a memory leak. PHP: For ($I = 0; $I < $count; $I++) { $retCd = createArray(&$arr); unset($arr); // for some reason this is necessary. } C Extension in createArray function: zval *Arr = 0; if (zend_parse_parameters(argc TSRMLS_CC, "z", &Arr) == FAILURE) return ; if (!PZVAL_IS_REF(Arr)) { zend_error(E_ERROR, "The Arr parameter must be passed by reference"); RETURN_NULL(); } array_init(Arr); if (add_assoc_string(Arr, (char *) szFieldName, (char *) szValue, 1) == FAILURE) { . . . } What can I do in my extension to unset or clear the variable so that it doesn’t have to be done in the PHP script? 2) For some reason, after the PHP script finishes, the amount of memory as reported by Linux ‘top’ does not go back down to it’s initial level. I notice this especially if I create large PHP arrays. This is very likely to be related to the previous problem. Thanks in advance, Bruce _________________________________________________________________ From must-see cities to the best beaches, plan a getaway with the Spring Travel Guide! http://special.msn.com/local/springtravel.armx

Wez Furlong

22 years ago
> > What can I do in my extension to unset or clear the variable so that it > doesn’t have to be done in the PHP script?
> if (!PZVAL_IS_REF(Arr)) > { > zend_error(E_ERROR, "The Arr parameter must be passed by reference");
^^^^^^^ Don't use E_ERROR in an extension unless it would be dangerous for execution to continue (eg: crash iminent); use E_WARNING instead.
> RETURN_NULL(); > }
SEPARATE_ZVAL(Arr);
> array_init(Arr); > > if (add_assoc_string(Arr, (char *) szFieldName, (char *) szValue, 1) == > FAILURE) { > . . . > }
Hope that helps, --Wez.