Req #52215 [Com]: Add var_ref_count()

From: Date: Mon, 09 May 2011 17:07:18 +0000
Subject: Req #52215 [Com]: Add var_ref_count()
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-160624@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=52215&edit=1

 ID:                 52215
 Comment by:         thegreatall at gmail dot com
 Reported by:        dev at alepe dot com
 Summary:            Add var_ref_count()
 Status:             Open
 Type:               Feature/Change Request
 Package:            Variables related
 Operating System:   Any
 PHP Version:        5.3.3RC1
 Block user comment: N
 Private report:     N

 New Comment:

I recently wrote a simple modification to the php source, which returns
the 
number of references linked to a variable. It does suffer from the same
problem 
that debug_zval_dump suffers from, but it is simply always +1 than what
you 
expect. Aadding a note in the documentation saying "The value will
always be 1 
more than the actual reference count." or just -1 from the returned
value should 
work.

If there's even a chance that this would be reviewed and possibly added
into 
php's source, I would be happy to make a patch for it. This function may
not 
seem critical, but I developed a framework that does allot of class
recycling 
and it would be nice to have the ability to figure out what variables it
can 
release, and a function like this or what I wrote would be HUGE in terms
of 
memory management. A conversion script I wrote uses upwards of 1-3 gigs
of ram 
if I recycle variables, but I could reduce that number to <10 megs if I
could 
figure out what variables are free'able. The workaround I have to work
with now 
is to either "guess" what isn't being used (which is almost always
wrong) or to 
not use any object recycling which is alot slower because it needs to
initiate a 
new object every time, and you can have 2 different objects to the same
data 
(which the huge downside to it is that there can be 2 objects for the
same 
record/data).


Previous Comments:
------------------------------------------------------------------------
[2010-07-01 13:44:40] derick@php.net

This won't work, for the same reason that debug_zval_dump() is flawed.
By passing a variable to a function, you mess with the refcount/is_ref
values. Xdebug's xdebug_debug_zval()
(http://xdebug.org/docs/all_functions#xdebug_debug_zval) goes around
that by looking up the symbol directly (but it doesn't support array
elements directly).

------------------------------------------------------------------------
[2010-07-01 03:49:32] dtajchreber@php.net

http://www.php.net/manual/en/function.debug-zval-dump.php

------------------------------------------------------------------------
[2010-07-01 03:34:42] dev at alepe dot com

Please excuse me if I have some theoretical misconceptions or if my
English is not very good.

------------------------------------------------------------------------
[2010-07-01 03:33:03] dev at alepe dot com

Description:
------------
It seems there is no easy way to know if an object/array/... is
reference. 

Looking at the source code of ext/standard/var.c it seems it may be not
so hard to add that function. As debug_zval_dump already outputs the
reference count, it would be better to obtain that value in order to
determine if an object is referenced or not. Maybe something like (I'm
not C programmer):

PHPAPI void php_var_ref_count(zval **struc)
{
    return Z_REFCOUNT_PP(struc);
}

Knowing the reference count may be helpful to:
- make copies of a structure without references
- remove variables that have more than 1 reference (safe remove)
- remove variables that are not referenced (unused values)
- prevent modifying a variable that is referenced 

I believe there must be more applications but these are the ones I can
think of.

(background:
http://stackoverflow.com/questions/3148125/php-check-if-object-array-is-a-reference)


Test script:
---------------
<?php

$en = array("a" => "apple", "b" => "banana");
$es = array("a" => "manzana", "b" => "platano");
$dict = array(
   "Eng" => $en,
   "Esp" => $es,
   "Non" => array("a" => "A", "b" => "B")
);

echo var_ref_count($dict["Eng"]); 
echo " # ";
echo var_ref_count($dict["Non"]); 

?>

Expected result:
----------------
2 # 1

Actual result:
--------------
None (inexistent)


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52215&edit=1


Thread (8 messages)

« previous php.bugs (#160624) next »