RE: Re: Profiling with register_tick_function / declare

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Shawn,

Thanks for the reply.  I am using php5+ only, so I'm quite sure that passing
the object by reference like that is done automatically.

Aren't all objects are automatically passed by reference in php5, so
therefore & is deprecated?  I tested your suggestion anyway, and it appeared
to make no difference.

The problem is to do with the scope that the "declare" directive affects.

Cheers anyway,

Scott

-----Original Message-----
From: Shawn McKenzie [mailto:nospam@xxxxxxxxxxxxx] 
Sent: Friday, February 08, 2008 5:43 AM
To: php-general@xxxxxxxxxxxxx
Subject:  Re: Profiling with register_tick_function / declare

McNaught, Scott wrote:
> Hi there,
> 
>  
> 
> Is it possible to make the declare(ticks=1) statement apply to *all*
> functions executed in a php script, regardless of scope?
> 
>  
> 
> I wish to write a profiler script to basically dump all the function call
> times through the execution of a script.  So far, I can only get it to
work
> for functions called via global scope.
> 
>  
> 
> My code calls only one function from the global scope, and then a whole
lot
> of functions in classes are invoked. The tick function is only invoked
once
> from calling this one global function.
> 
>  
> 
> Here is my code:
> 
>  
> 
> <?php
> 
> declare(ticks = 1);
> 
>  
> 
> /**
> 
>  * Profiler
> 
>  * 
> 
>  * @version SVN: $Id$
> 
>  * @author Scott McNaught 
> 
>  */
> 
> class Profiler
> 
> {
> 
>       protected $m_arrProfileData = array();
> 
>       protected $m_strCurrentFunction = null;
> 
>       protected $m_iLastTime = null;
> 
>  
> 
>       /**
> 
>        * Begins profiling
> 
>        */
> 
>       public function start()
> 
>       {
> 
>             $this->m_iLastTime = time();
> 
>       }
> 
>  
> 
>       /**
> 
>        * Finishes profiling and dumps the results
> 
>        */
> 
>       public function end()
> 
>       {
> 
>             var_dump($this->m_arrProfileData);
> 
>             $this->m_arrProfileData = array();
> 
>             $this->m_strCurrentFunction = null;
> 
>       }
> 
>  
> 
>       public function tick()
> 
>       {
> 
>             $arrBacktrace = debug_backtrace();
> 
>             
> 
>             if (!isset($arrBacktrace[1]))
> 
>             {
> 
>                   return;
> 
>             }
> 
>             
> 
>             $strFunction = $arrBacktrace[1]['function'];
> 
>             
> 
>             if (isset($arrBacktrace[1]['class']))
> 
>             {
> 
>                   $strFunction = $arrBacktrace[1]['class'] . '::' .
> $strFunction;
> 
>             }
> 
>             
> 
>             $iTime = microtime(true);
> 
>             
> 
>             if (!isset($this->m_arrProfileData[$strFunction]))
> 
>             {
> 
>                   $this->m_arrProfileData[$strFunction] = $iTime;
> 
>             }
> 
>             
> 
>             $this->m_arrProfileData[$strFunction] += $iTime -
> $this->m_iLastTime;
> 
>             $this->m_iLastTime = $iTime;
> 
>             $this->m_strCurrentFunction = $strFunction;
> 
>       }
> 
> }
> 
>  
> 
> $pProfiler = new Profiler();
> 
> register_tick_function($pProfiler, 'tick'), true);
> 
>  
> 
> ?>
> 
>  
> 
>  
> 
> Then from index.php.
> 
>  
> 
> <?php
> 
>  
> 
> if(isset($_GET['profile']))
> 
> {
> 
>       include('profiler.inc.php');
> 
> }
> 
>  
> 
> function execute()
> 
> {
> 
>       $pClass = new SomeClass();
> 
>       $pClass->someFunction();
> 
> }
> 
>  
> 
> execute(); // TICK IS CALLED FROM EXECUTING THIS 
> 
>  
> 
> ?>
> 
>  
> 
> So a tick is made from calling execute() from global scope, and that is
it.
> I want it to tick when someFunction() is called.
> 
>  
> 
> I would really appreciate any help that anyone can give me with this as I
> have struggled with it for a while, and there is not much documentation
> about this anywhere. 
> 
> This could potentially benefit a lot of people if engineered right.  I am
> trying to make a profiler include file which will be able to be used with
> one line of file.  
> 
>  
> 
> This will allow people to:
> 
> .         Get quick profiler results on demand by adding something to the
> query string - eg - ?profile=1
> 
> .         Get profile results for novices without having to mess around
> installing php binaries such as APD / zend debugger etc
> 
> .         Profile on demand on production servers without having to
install
> a resource intensive debugging module
> 
>  
> 
> Any help greatly appreciated.
> 
>  
> 
> Thanks,
> 
>  
> 
> Scott McNaught
> 
>  
> 
> 
First off:

register_tick_function(array(&$pProfiler, 'tick'), true);

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux