McNaught, Scott wrote:
> 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:[EMAIL PROTECTED]
> Sent: Friday, February 08, 2008 5:43 AM
> To: [email protected]
> Subject: [PHP] 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);
>
My point was the missing 'array(' in that statement.
The code seems to work for me if $pClass->someFunction() actually does
something. If it is empty it doesn't appear in the resulting profiler
array. For example, here is what I have that works:
<?php
$pProfiler->start();
function execute()
{
$pClass = new SomeClass();
$pClass->someFunction();
}
execute(); // TICK IS CALLED FROM EXECUTING THIS
$pProfiler->end();
class someClass
{
public function someFunction()
{
echo "HELLO!";
}
}
?>
This shows:
HELLO!array(4) {
["include"]=>
float(2404831569.3143)
["Profiler::start"]=>
float(1202415785.3143)
["execute"]=>
float(1202415784.6574)
["someClass::someFunction"]=>
float(1202415784.6593)
}
But with an empty someFunction() I get:
array(3) {
["include"]=>
float(2404831928.8424)
["Profiler::start"]=>
float(1202415964.8424)
["execute"]=>
float(1202415964.4215)
}
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php