-Ben
Todd Ruth wrote:
I have a feeling that PHP has a memory problem somewhere :/.
I'm not sure if it caused any of the issues either of you spoke of, but I can report that PHP does have some pointer problems. I've been putting off this email until I had written up something nicer, but it's probably better to just get the word out (assuming this isn't already known)...
PHP has problems related to using a temporary as the source for a reference. An obvious no-no is to write "$x =& NULL;" or "$x =& @$y[5];". These are parse errors. On the other hand, PHP won't complain about:
function &f() { $y = array(); return @$y[5]; } $x =& f();
It even acts OK. The above code could be a mistake or it could be
a misguided attempt at optimization (believing that keeping a ref
to a temporary is better than setting $x equal to the temporary).
Maybe there was a desire to modify $y if applicable, but otherwise
be OK with modifying a temporary. In any case, if you have a large enough system and code like that lying around, there's a good chance you'll get crashes. You may not get a crash but instead see unrelated
data mysteriously changed in functions that get called later.
There are at least 2 ways to adjust the code above to make PHP
happy. One is to remove the "&" in the assignment. Another is
to create a "real" temporary variable instead of letting PHP make its
own temporary. ie
function &f() { $y = array(); $temp = @$y[5]; return $temp; } $x =& f();
I've had crashes go away and mysterious data overwrites go away with the only change to the system being replacing a piece of code like the first block of this email with a piece of code like the second block. This has happened for just about every kind of "=& temp" you can think of. Here are a few examples (in addition to the case above) of using temporaries as sources for references. I think we've had a crash / mysterious data overwrite for just about all of these (if not all).
function f1() { $y = 5; return $y; } $x =& f1(); // Get rid of the & or add an & to f1
function &f2() { return NULL; // Get rid of & below or use "$r = NULL; return $r;" } $x =& f2();
function g() { return NULL; } function h(&$x) { $x = 5; } h(g());
That last one could use some combination of the above recommendations to be fixed. For the record, I agree that there are few (if any) cases where the above code is the best code for a design problem, but I also dislike that these code blocks can lead to crashes / corruptions.
BTW, we have never had a problem with using a temporary reference as the source for a non-reference copy. That is to say the following has never caused us a problem:
function &f() { $y = 5; return $y; } $x = f();
Best of luck, Todd
-- Regards, Ben Ramsey http://benramsey.com http://www.phpcommunity.org/wiki/People/BenRamsey
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php