Difference between revisions of "Sven/PHP"

From Organic Design wiki
m (Introspection)
(Debugging PHP)
Line 4: Line 4:
 
Debuggers generally use a [[W:Stack trace]]. This can be approximated by using [http://www.php.net/print print] and [http://www.php.net/die die] statements in sections of code. The combination of [http://www.php.net/print_r print_r] and [http://www.php.net/func_get_args func_get_args] allows you to return an array of args that a function was called with;
 
Debuggers generally use a [[W:Stack trace]]. This can be approximated by using [http://www.php.net/print print] and [http://www.php.net/die die] statements in sections of code. The combination of [http://www.php.net/print_r print_r] and [http://www.php.net/func_get_args func_get_args] allows you to return an array of args that a function was called with;
  
[http://www.php.net/print_r print_r]([http://www.php.net/func_get_args func_get_args]());
+
{{code|
 +
<php>
 +
print_r(func_get_args());
 +
</php>
 +
}}
  
 
Casting an object of an array builds an array of the properties, mapping property names to values. e.g.
 
Casting an object of an array builds an array of the properties, mapping property names to values. e.g.
 
+
{{code|
 +
<php>
 
  class Person {
 
  class Person {
 
   var $name = "Fred";
 
   var $name = "Fred";
Line 14: Line 19:
 
  $o = new Person;
 
  $o = new Person;
 
  $a = (array) $o
 
  $a = (array) $o
[http://www.php.net/print_r print_r]($a);
+
print_r($a);
 +
</php>
 +
}}
  
 
outputs;
 
outputs;

Revision as of 22:49, 5 January 2008

Debugging PHP

Info.svg In MediaWiki there is a profiler that can be set, see MW:How to debug.


Debuggers generally use a W:Stack trace. This can be approximated by using print and die statements in sections of code. The combination of print_r and func_get_args allows you to return an array of args that a function was called with;


<php>

print_r(func_get_args()); </php>

Casting an object of an array builds an array of the properties, mapping property names to values. e.g.

{{{1}}}

outputs;

Array
(
[name] => Fred
[age] => 35
)

Introspection

Info.svg


<php>

  1. Example:

$classes = get_declared_classes(); foreach($classes as $list) {

 print ("$list 
");

} </php>

<php> function printArray(&$array) {

 if (isset($wgCommandLineMode)) {
   $rc = "\n";
 } else {
   $rc ="
"; }
 foreach($array as $key => $value) {
   print "array: key => $value$rc";
 }
 return();

}

</php>

From Sven/Notes, Extension:Fasta.php; <php>

  1. Logging to an article from within the MW environment

function logAdd($article,$msg) { $ts = $GLOBALS['wgLang']->timeanddate(wfTimestampNow(),true); $la = new Article(Title::newFromText($article)); $la->quickEdit($la->getContent()."\n*$ts: $msg"); }

  1. Logging to a file

function logFile($file, $msg) { $fh = fopen($file,'a'); $ts = $GLOBALS['wgLang']->timeanddate(wfTimestampNow(),true); if(is_array($msg)) $msg = print_r($msg, true); fwrite($fh, "\n$ts: $msg"); # $ts = date("Y-m-d H:i:s"); # @file_put_contents($wgPayPalLog,"$ts $text\n",FILE_APPEND); } </php>

PHP errors

To see PHP errors, add this to the very top of LocalSettings.php: <php> error_reporting(E_ALL); ini_set("display_errors", 1); </php>

MediaWiki profiler

The article how to debug MediaWiki provides information on setting up the profiler by adding the globals to your LocalSettings.php file;

<php> /**

* The debug log file should be not be publicly accessible if it is used, as it
* may contain private data.  But it must be in a directory to which PHP run
* within your Web server can write. */

$wgDebugLogFile = '/tmp/MW_log.txt';

  1. Profiling / debugging

/** Enable for more detailed by-function times in debug log */ $wgProfiling = true; /** Only record profiling info for pages that took longer than this */ $wgProfileLimit = 0.0; /** Don't put non-profiling info into log file */ $wgProfileOnly = false; /** Log sums from profiling into "profiling" table in db. */ $wgProfileToDatabase = false; /** Only profile every n requests when profiling is turned on */ $wgProfileSampleRate = 1; /** If true, print a raw call tree instead of per-function report */ $wgProfileCallTree = false; /** If not empty, specifies profiler type to load */ $wgProfilerType = ;

/** Settings for UDP profiler */ $wgUDPProfilerHost = '127.0.0.1'; $wgUDPProfilerPort = '3811';

/** Detects non-matching wfProfileIn/wfProfileOut calls */ $wgDebugProfiling = true; /** Output debug message on every wfProfileIn/wfProfileOut */ $wgDebugFunctionEntry = 1; /** Lots of debugging output from SquidUpdate.php */ $wgDebugSquid = false; </php>

However if you include in an extension; <php> include("$IP/includes/GlobalFunctions.php"); wfDebug("This is just testing the debug tracing stuff\n"); </php> there seems to be no output in the generated log file.

See also

Debugging
Documentation
Extensions
Resources