Bug->Doc #42585 [Opn->Ver]: die() in event handler => PHP hangs

From: Date: Wed, 04 Nov 2020 13:39:07 +0000
Subject: Bug->Doc #42585 [Opn->Ver]: die() in event handler => PHP hangs
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-18083@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=42585&edit=1

 ID:                 42585
 Updated by:         cmb@php.net
 Reported by:        csaba at alum dot mit dot edu
 Summary:            die() in event handler => PHP hangs
-Status:             Open
+Status:             Verified
-Type:               Bug
+Type:               Documentation Problem
 Package:            COM related
 Operating System:   Win XP Pro
 PHP Version:        5.2.4
-Assigned To:        
+Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

The problem here is that, prior to PHP 8.0.0, die() causes a so
called "unclean shutdown", what prevents the unbinding of the
bound event sink, causing a hang (or potentially other issue).
Throwing an exception instead of calling die() would solve that.
Given that this issue is fixed in PHP 8.0.0, I'm changing this to
doc problem.


Previous Comments:
------------------------------------------------------------------------
[2007-09-07 11:04:43] jani@php.net

Assigned to the COM maintainer.

------------------------------------------------------------------------
[2007-09-07 09:49:16] csaba at alum dot mit dot edu

Description:
------------
If I have a COM object call into PHP (via com_event_sink or IE's window.setTimeout) with a
die() within the called code, then PHP hangs.

In the example below, IE comes up and waits around for 4 seconds, after which an $ie->quit() is
issued.  In the event handler (function OnQuit()) a die() is issued.  While IE does shut down, PHP
does not return me the command prompt.  This is from PHP CLI, of course.

Csaba Gabor from Vienna

Reproduce code:
---------------
<?php 
class IESink { 
  public $terminated = false; 
  public function TitleChange($text) { 
    echo("title has changed: $text \n"); }

  public function OnQuit() { 
    print "Quitting\n";
    die();
    print "Died\n";
    $this->terminated = true; 
  } } 

$ie = new COM("InternetExplorer.Application"); 
$ie->Visible = true; 
$sink = new IESink; 
com_event_sink($ie, $sink, "DWebBrowserEvents2"); 
$ie->Navigate("http://www.php.net/"); 

$start = time();
$quitted = false;

while (!$sink->terminated) { 
  com_message_pump(200); 
  if (time()-$start>4 && !$quitted) {
    $quitted=true;
    $ie->quit(); } } 
print "Finished!\n"; 
?>

Expected result:
----------------
I expect to be shown the following three lines, ie to go away, AND for PHP to terminate:
title has changed: PHP: Hypertext Preprocessor
title has changed: PHP: Hypertext Preprocessor
Quitting

Actual result:
--------------
The above 3 lines are shown, IE goes away, BUT php does not terminate.

Also, note that if I manually shut IE down, instead of waiting the 4 seconds, then I get the
following additional line (and PHP still hangs the cmd prompt):
Fatal error: Call to undefined method com::quit() in Unknown on line 0

It seems to me that the while loop stays active, since that's the only place that
$ie->quit() is issued.


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



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


Thread (2 messages)

« previous php.doc.bugs (#18083) next »