Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:18702 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 2859 invoked by uid 1010); 7 Sep 2005 23:47:48 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 2844 invoked from network); 7 Sep 2005 23:47:48 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 7 Sep 2005 23:47:48 -0000 X-Host-Fingerprint: 80.74.107.235 mail.zend.com Linux 2.5 (sometimes 2.4) (4) Received: from ([80.74.107.235:42070] helo=mail.zend.com) by pb1.pair.com (ecelerity 2.0 beta r(6323M)) with SMTP id 30/A9-23233-22C7F134 for ; Wed, 07 Sep 2005 19:47:47 -0400 Received: (qmail 29415 invoked from network); 7 Sep 2005 23:47:40 -0000 Received: from localhost (HELO ANDI-NOTEBOOK.zend.com) (127.0.0.1) by localhost with SMTP; 7 Sep 2005 23:47:40 -0000 Message-ID: <6.2.3.4.2.20050907164645.0905ed90@localhost> X-Mailer: QUALCOMM Windows Eudora Version 6.2.3.4 Date: Wed, 07 Sep 2005 16:47:34 -0700 To: iamstever@gmail.com,Scott MacVicar Cc: internals@lists.php.net,Zeev Suraski In-Reply-To: <57792e85050906111963cd6303@mail.gmail.com> References: <5.1.0.14.2.20050904235929.06963d60@localhost> <431D9B9E.6080303@ntlworld.com> <57792e85050906111963cd6303@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; format=flowed Subject: Re: [PHP-DEV] Re: 5.0.5 From: andi@zend.com (Andi Gutmans) The real solution is to have a two-phased shutdown sequence in PHP 6 because we're constantly "Fixing" the shutdown due to chicken&egg problem. At 11:19 AM 9/6/2005, steve wrote: >I agree. Having no access MySQL(i) during shutdown has already broken >scripts I've used. Thankfully, Jani mentioned the change so I no >longer felt like I was going crazy, and I was able to work around it >by creating a "shutdown object" that contained references to all the >objects it might need, and then used it's destroy call. Same issue in >5.1. > >If the behavior is to change from what we expect, I'd propose that we >add something to the manual. That said, I only found this problem >because of strange Fatal Error in Unknown on line 0 errors in the >error log. It took me a while to link that to the change in shutdown >behavior, and I don't think too many will be able to make the link >between the two. > >My $0.02. > >-steve-- > > > >On 9/6/05, Scott MacVicar wrote: > > Zeev Suraski wrote: > > > If there are no (ultra last) objections, I'll roll 5.0.5 tomorrow > > > morning (.il/Europe time) and post it in the evening. > > > > > > Zeev > > > > I'm still objecting to a patch by Jani made in April to move destructor > > before shutdown functions. It was in response to the following report, > > http://bugs.php.net/bug.php?id=30578 > > > > The problem being other than the fact that it's broken some BC is that > > when it comes around to using the shutdown function any objects you > > might actually have wished to use have since had their destructor called > > closing connections and finalising data. > > > > All I am proposing is that the shutdown function is run prior to > > destruct functions being called as I don't expect to still be able to > > access objects after the destructor is called which is still the case. > > Changing the order doesn't effect bug 30578 which it was fixing. > > > > The attached code demonstrates the problem, I'd expect to get the > > following output > > > > __construct > > execution > > execution > > __destruct > > > > the shutdown function checking the last step run, unfortunately I get > > > > __construct > > execution > > __destruct > > __destruct > > > > Even though the destructor has been called I can still access the object > > and fetch the value of the step variable. > > > > Scott > > > > > > > > > error_reporting(E_ALL); > > > > class example > > { > > var $step; > > function __construct() > > { > > echo "__construct\n"; > > $this->step = '__construct'; > > } > > function execution() > > { > > echo "execution\n"; > > $this->step = 'execution'; > > } > > function __destruct() > > { > > echo "__destruct\n"; > > $this->step = '__destruct'; > > } > > } > > echo "
";
> > $obj = new example();
> > $obj->execution();
> >
> > function shutdown()
> > {
> >         global $obj;
> >         echo $obj->step . "\n";
> > }
> > register_shutdown_function('shutdown');
> > ?>
> >
> > Index: main/main.c
> > ===================================================================
> > RCS file: /repository/php-src/main/main.c,v
> > retrieving revision 1.648
> > diff -u -r1.648 main.c
> > --- main/main.c 2 Sep 2005 14:08:09 -0000       1.648
> > +++ main/main.c 6 Sep 2005 13:12:22 -0000
> > @@ -1319,16 +1319,16 @@
> >         EG(opline_ptr) = NULL;
> >         EG(active_op_array) = NULL;
> >
> > -       /* 1. Call all possible __destruct() functions */
> > +       /* 1. Call all possible shutdown functions registered 
> with register_shutdown_function() */
> > +       if (PG(modules_activated)) zend_try {
> > +               php_call_shutdown_functions(TSRMLS_C);
> > +       } zend_end_try();
> > +
> > +       /* 2. Call all possible __destruct() functions */
> >         zend_try {
> >                 zend_call_destructors(TSRMLS_C);
> >         } zend_end_try();
> >
> > -       /* 2. Call all possible shutdown functions registered 
> with register_shutdown_function() */
> > -       if (PG(modules_activated)) zend_try {
> > -               php_call_shutdown_functions(TSRMLS_C);
> > -       } zend_end_try();
> > -
> >         /* 3. Flush all output buffers */
> >         zend_try {
> > 
> php_end_ob_buffers((zend_bool)(SG(request_info).headers_only?0:1) TSRMLS_CC);
> >
> >
> > Index: main/main.c
> > ===================================================================
> > RCS file: /repository/php-src/main/main.c,v
> > retrieving revision 1.604.2.22
> > diff -u -r1.604.2.22 main.c
> > --- main/main.c 16 Aug 2005 18:11:34 -0000      1.604.2.22
> > +++ main/main.c 6 Sep 2005 13:34:15 -0000
> > @@ -1194,14 +1194,14 @@
> >                 sapi_send_headers(TSRMLS_C);
> >         } zend_end_try();
> >
> > +       if (PG(modules_activated)) zend_try {
> > +               php_call_shutdown_functions(TSRMLS_C);
> > +       } zend_end_try();
> > +
> >         zend_try {
> >                 zend_call_destructors(TSRMLS_C);
> >         } zend_end_try();
> >
> > -       if (PG(modules_activated)) zend_try {
> > -               php_call_shutdown_functions(TSRMLS_C);
> > -       } zend_end_try();
> > -
> >         if (PG(modules_activated)) {
> >                 zend_deactivate_modules(TSRMLS_C);
> >                 php_free_shutdown_functions(TSRMLS_C);
> >
> >
> > Index: main/main.c
> > ===================================================================
> > RCS file: /repository/php-src/main/main.c,v
> > retrieving revision 1.640.2.4
> > diff -u -r1.640.2.4 main.c
> > --- main/main.c 2 Sep 2005 14:05:45 -0000       1.640.2.4
> > +++ main/main.c 6 Sep 2005 13:17:14 -0000
> > @@ -1200,16 +1200,16 @@
> >         EG(opline_ptr) = NULL;
> >         EG(active_op_array) = NULL;
> >
> > -       /* 1. Call all possible __destruct() functions */
> > +       /* 1. Call all possible shutdown functions registered 
> with register_shutdown_function() */
> > +       if (PG(modules_activated)) zend_try {
> > +               php_call_shutdown_functions(TSRMLS_C);
> > +       } zend_end_try();
> > +
> > +       /* 2. Call all possible __destruct() functions */
> >         zend_try {
> >                 zend_call_destructors(TSRMLS_C);
> >         } zend_end_try();
> >
> > -       /* 2. Call all possible shutdown functions registered 
> with register_shutdown_function() */
> > -       if (PG(modules_activated)) zend_try {
> > -               php_call_shutdown_functions(TSRMLS_C);
> > -       } zend_end_try();
> > -
> >         /* 3. Flush all output buffers */
> >         zend_try {
> > 
> php_end_ob_buffers((zend_bool)(SG(request_info).headers_only?0:1) TSRMLS_CC);
> >
> >
> >
> > --
> > PHP Internals - PHP Runtime Development Mailing List
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
> >
>
>--
>PHP Internals - PHP Runtime Development Mailing List
>To unsubscribe, visit: http://www.php.net/unsub.php