php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #42585 die() in event handler => PHP hangs
Submitted: 2007-09-07 09:49 UTC Modified: 2020-11-04 13:39 UTC
Votes:8
Avg. Score:2.6 ± 0.7
Reproduced:1 of 2 (50.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: csaba at alum dot mit dot edu Assigned: cmb (profile)
Status: Closed Package: COM related
PHP Version: 5.2.4 OS: Win XP Pro
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: csaba at alum dot mit dot edu
New email:
PHP Version: OS:

 

 [2007-09-07 09:49 UTC] 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.

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-09-07 11:04 UTC] jani@php.net
Assigned to the COM maintainer.
 [2017-10-24 03:32 UTC] kalle@php.net
-Status: Assigned +Status: Open -Assigned To: wharmby +Assigned To:
 [2020-11-04 13:39 UTC] cmb@php.net
-Status: Open +Status: Verified -Type: Bug +Type: Documentation Problem -Assigned To: +Assigned To: cmb
 [2020-11-04 13:39 UTC] cmb@php.net
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.
 [2020-11-04 13:50 UTC] phpdocbot@php.net
Automatic comment on behalf of cmb
Revision: http://git.php.net/?p=doc/en.git;a=commit;h=e604424d6d60d5cd9489bec6312c20195abe2c07
Log: Fix #42585: die() in event handler =&gt; PHP hangs
 [2020-11-04 13:50 UTC] phpdocbot@php.net
-Status: Verified +Status: Closed
 [2020-11-04 18:05 UTC] phpdocbot@php.net
Automatic comment on behalf of mumumu
Revision: http://git.php.net/?p=doc/ja.git;a=commit;h=0b849b3911c8600f4df2b5edb44c62da7229ec20
Log: Fix #42585: die() in event handler =&gt; PHP hangs
 [2020-12-30 11:58 UTC] nikic@php.net
Automatic comment on behalf of mumumu
Revision: http://git.php.net/?p=doc/ja.git;a=commit;h=6a381e8516b4f83db0dd4a63132d9ffd5881c84f
Log: Fix #42585: die() in event handler =&gt; PHP hangs
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Dec 26 15:01:32 2024 UTC