Dear folks,

I've experieced that PHP executing the same script multiple times again.

First time was when foreach() was destorying memory due to invalid data 
type is passed to foreach(). (Fixed by Andi. Thanks) Now I have another 
code that make script execute multiple times. (PHP 4.0.7RC1, PHP 
4.0.8-dev) Wired behaviors are exactly the same as foreach() bug.
I verified multiple script execution by ob_get_contents(), die() and 
error_log().

Simplfied(Pesudo) code is as follows (Note: simple code will not 
reproduce this problem)

======== BEGIN =========
<?php
ob_start();

class foo {
  function foo() {
   switch($user_input1) {
    case 'A':
     $this->handle_user_input1();
    break;
    case '..':
     // Call other user input1 hanlder
    break;
   }
   // print(ob_get_contents()); <= Debug code #1. Uncomment this 
displays RESULT_HTML*(RESULT_HTML+ERROR_HTML)*3.
   // die(__FILE__.__LINE__); <= Debug code #2. Uncommenting this 
displays RESULT_HTML+error_HTML
  }

  function handle_user_input1() {
   switch($user_input2) {
    case 'X':
     // do some work
     if ($multiple_submit) {
      include('ERROR_HTML'); // Error page show multiple submit for the 
same data.
     }
     else {
      include('RESULT_HTML'); // Result page shows sccuessful submit
      // die(__FILE__.__LINE__); <= Debug code #3. Uncommenting this 
displys RESULT_HTML.
     }
   }
  }
} // class foo

$obj = new foo;
?>
========== END =========

When I uncomment Debug code #1. Browser displays 
RESULT_HTML+(RESULT_HTML*ERROR_HTML)*N. (Note: RESULT_HTML+ERROR_HTML is 
displied N times) If I comment out Debug code #1, I get 
RESULT_HTML*ERROR_HTML.

When I uncomment Debug code #2, script dies and displays 
RESULT_HTML+ERROR_HTML.

When I uncomment Debug code #3, script displays RESULT_HTML.

I see page 'RESULT_HTML' followed by 'ERROR_HTML' which should never 
happen. When I put error_log(), there are log messages indicating the 
method is called multiple times. It seems Zend engine (output buffering 
code or other code) hides multiple script executions somewhat/somehow.

I've already modified the script so that PHP will not execute the same 
script multiple times. (I moved code, that detectes multiple submit, to 
other script, then PHP stopped doing this) I didn't find out which PHP 
function/language construct/feature is causing this problem so far. I 
don't get core file. (I'll report this bug if I could get core or find 
out what's wrong)

Anyway, Zend engine seems to have tendency executing script multiple 
times when there is memory corruption.

error_log()/die() (or gdb) can be used find out this problem, but it's 
much easier to find if PHP has trace log feature. I think it would be 
useful to find some bugs in PHP itself as well as script bugs created by 
users.

Is it feasible to add trace log option that enables logging 
function/class method names called? (At least for debug enabled PHP?)

--
Yasuo Ohgaki


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to