On Thu, 2007-12-20 at 19:54 +0000, George Pitcher wrote: > > On Thu, December 20, 2007 8:37 am, Christoph Boget wrote: > > > Let's say I have the following 3 files > > > > > > global.php > > > <? > > > function myFunc() { echo __FILE__; } > > > ?> > > > > > > one.php > > > <? > > > include( 'global.php' ); > > > echo 'You are in file: '; > > > myFunc(); > > > ?> > > > > > > two.php > > > <? > > > include( 'global.php' ); > > > echo 'You are in file: '; > > > myFunc(); > > > ?> > > > > > > In each case, what is echoed out for __FILE__ is global.php. Apart > > > from > > > analyzing the debug_backtrace array, is there any way that myFunc() > > > would > > > display "one.php" and "two.php" respectively? > > > > $_SERVER['PHP_SELF'] and other bits in $_SERVER have the "main" PHP > > filename in them. > > > > __FILE__ will always be exactly the file that it's in. > > > > In between, I think you are stuck with the debug_backtrace. > > > > NOTE: > > If it's for error logging or error reporting, note that trigger_error > > automatically passes in the file/line to the error handler. > > I'm far from being an expert, and often see more efficient ways of doing > things (more efficient tham my own methods). Howevr, I've just been dealing > with a similar problem. > > I have a functions file with over 400 functions (and that may be too many - > but it works). I've been adding some error reporting in to my PEAR::DB > queries, but wanted to know which page triggered the function. I went > theough my php pages and gane each one a $pg variable at the start > containing the bare name of the file, eg 'home' rather than 'home.php'. I > then went to each function containing either a DB query (ore one which calls > another DB-related function. I did a global search and replace for the > function name 'func(' replaced by 'func($pg,'. I use Dreamweaver so this was > fairly straightforward. > > It worked for me, but now someone is about to show me a quicker, cleaner > way, aren't they? Yes, I am. <?php function checkpoint() { $trace = debug_backtrace(); $caller = isset( $trace[0] ) ? $trace[0] : array(); $owner = isset( $trace[1] ) ? $trace[1] : array(); $file = isset( $caller['file'] ) ? $caller['file'] : null; $class = isset( $owner['class'] ) ? $owner['class'] : null; $function = isset( $owner['function'] ) ? $owner['function'] : null; $line = isset( $caller['line'] ) ? $caller['line'] : null; $type = isset( $owner['type'] ) ? $owner['type'] : null; list( $timeSub, $time ) = explode( ' ', microtime() ); $timeSub = ereg_replace( '^[^.]\.', '', $timeSub ); $timeSub = substr( str_pad( $timeSub, 6, '0' ), 0, 6 ); echo 'Checkpoint ' .'['.date( 'Y-m-d H:i:s', $time ).'.'.$timeSub.']: ' .($file === null ? '' : $file.' ') .($line === null ? '' : sprintf( '{%05d} ', $line )) .($class === null ? '' : $class.$type) .($function === null ? '' : $function.'()') .$this->nl; } ?> I often use the above function when debugging code. It prints detailed information about where it was called. I have something similar in my error handler but it's not as concise for error related reasons. It doesn't strike me as an issue that it's a heavy function since it's used in a debugging context or when an error is present. In which case, it shouldn't be called in production.... at least not often :) Cheers, Rob. -- ........................................................... SwarmBuy.com - http://www.swarmbuy.com Leveraging the buying power of the masses! ........................................................... -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php