{"id":91,"date":"2010-03-25T17:36:26","date_gmt":"2010-03-25T16:36:26","guid":{"rendered":"http:\/\/www.4amics.com\/x.perez\/?p=91"},"modified":"2010-03-26T14:25:11","modified_gmt":"2010-03-26T13:25:11","slug":"codeginiter-profiler-with-firephp","status":"publish","type":"post","link":"https:\/\/www.4amics.com\/x.perez\/2010\/03\/codeginiter-profiler-with-firephp\/","title":{"rendered":"Codeginiter profiler with FirePHP"},"content":{"rendered":"<p>I have added to my own Profiler the hability to display results on Firebug. I have two form of display data: firebar or window.\u00a0 Window display data on a div over the code, allowing to read enterilly all the page, meanehilr firebar\u00a0display data on the firebug console (must to have instaled firephp )<\/p>\n<p><!--more--><\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>Window display data on a div over the code, allowing to read enterilly all the page<\/p>\n<p><a href=\"http:\/\/www.4amics.com\/x.perez\/wp-content\/uploads\/2010\/03\/EasyCapture21.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-94\" title=\"EasyCapture2\" src=\"http:\/\/www.4amics.com\/x.perez\/wp-content\/uploads\/2010\/03\/EasyCapture21-1024x191.jpg\" alt=\"\" width=\"499\" height=\"88\" \/><\/a><\/p>\n<p>Firebar display data on the firebug console (must to have instaled firephp ) See : <a href=\"http:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/6149\" target=\"_blank\">http:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/6149<\/a><\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.4amics.com\/x.perez\/wp-content\/uploads\/2010\/03\/EasyCapture11.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-101\" title=\"EasyCapture1\" src=\"http:\/\/www.4amics.com\/x.perez\/wp-content\/uploads\/2010\/03\/EasyCapture11-300x92.jpg\" alt=\"\" width=\"300\" height=\"92\" srcset=\"https:\/\/www.4amics.com\/x.perez\/wp-content\/uploads\/2010\/03\/EasyCapture11-300x92.jpg 300w, https:\/\/www.4amics.com\/x.perez\/wp-content\/uploads\/2010\/03\/EasyCapture11.jpg 381w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">\n<p>To install MY_Profiler:<\/p>\n<p><span style=\"color: #993300;\">Download FirePHPCore : <a href=\"http:\/\/www.firephp.org\/HQ\/Install.htm\" target=\"_blank\">http:\/\/www.firephp.org\/HQ\/Install.htm<\/a><\/span><\/p>\n<p><span style=\"color: #993300;\"><strong><span style=\"text-decoration: underline;\">PLUGIN INSTALL<\/span><\/strong><br \/>\n<\/span><\/p>\n<p><span style=\"color: #993300;\">Unpack and copy FirePHPCore directory under your application\/plugin directory<\/span><\/p>\n<p><span style=\"color: #993300;\">Create a file under application\/plugin directory as:\u00a0 firephp_pi.php with this content:<br \/>\n<\/span><\/p>\n<blockquote><p><span style=\"color: #993300;\">&lt;?php<br \/>\n$Base_pathinfo = pathinfo(__FILE__);<br \/>\ninclude $Base_pathinfo[&#8216;dirname&#8217;].DIRECTORY_SEPARATOR.&#8221;FirePHPCore&#8221;.DIRECTORY_SEPARATOR.&#8221;fb.php&#8221;;<\/span><\/p><\/blockquote>\n<p>Change your autoload.php file (in config folder), to load firePHP:<\/p>\n<blockquote><p><span style=\"color: #993300;\">$autoload[&#8216;plugin&#8217;] = array(&#8216;FirePHP&#8217;);<\/span><\/p><\/blockquote>\n<p><span style=\"color: #993300;\"><strong><span style=\"text-decoration: underline;\">LIBRARY INSTALL<\/span><\/strong><\/span><\/p>\n<p><span style=\"color: #993300;\">Unpack and copy FirePHPCore directory under your application\/libraries directory<\/span><\/p>\n<p><span style=\"color: #993300;\">If you install as library, remember to add this line to the MY_profile.php before firePHP call:<\/span><\/p>\n<blockquote><p><span style=\"color: #993300;\"><code>$this-&gt;load-&gt;library('firephp');<\/code><\/span><\/p><\/blockquote>\n<p><span style=\"color: #993300;\">This method allows to load firephp library only when you want, or when IP detected, or&#8230; your choice.<br \/>\n<\/span><\/p>\n<p><strong>NEXT STEEP:<\/strong><\/p>\n<p>Add a config line to your config.php file:<\/p>\n<blockquote><p><span style=\"color: #993300;\">$config[&#8216;firePHP&#8217;] = &#8216;firebar&#8217;; \/\/ Options:\u00a0\u00a0 window or firebar<\/span><\/p><\/blockquote>\n<p>Be sure your libraries are prefized by &#8220;MY_ &#8221;\u00a0 or change the filename to your own prefix:<\/p>\n<blockquote><p><span style=\"color: #993300;\">$config[&#8216;subclass_prefix&#8217;] = &#8216;MY_&#8217;;<\/span><\/p><\/blockquote>\n<p>Download MY_profiler and copy to your libraries folder:\u00a0 <span style=\"text-decoration: underline;\"><a href=\"http:\/\/code.google.com\/p\/codeigniter-profiler-slide\/\" target=\"_blank\">Download My_profiler<\/a><\/span><\/p>\n<p>Remember to enable profiler in your controler\/model:<\/p>\n<blockquote><p><span style=\"color: #993300;\">$this-&gt;output-&gt;enable_profiler(TRUE);<\/span><\/p><\/blockquote>\n<p>Post your comments if you like it !!<\/p>\n<div id=\"_mcePaste\" style=\"overflow: hidden; position: absolute; left: -10000px; top: 640px; width: 1px; height: 1px;\">&lt;?php if (!defined(&#8216;BASEPATH&#8217;)) exit(&#8216;No direct script access allowed&#8217;);<\/p>\n<p>class MY_Profiler extends CI_Profiler<br \/>\n{<br \/>\nfunction MY_profiler()<br \/>\n{<br \/>\nparent::CI_Profiler();<br \/>\n}<\/p>\n<p>function run()<br \/>\n{<br \/>\nif ($this-&gt;CI-&gt;config-&gt;item(&#8220;firePHP&#8221;) == &#8220;window&#8221;)<br \/>\n{<br \/>\n\/\/ START JQueryLoad<br \/>\n\/\/ Remove if you load Jquery else where<br \/>\n$output = &#8216;&lt;script type=&#8221;text\/Javascript&#8221; src=&#8221;\/js\/jquery.js&#8221;&gt;&lt;\/script&gt;&#8217;;<br \/>\n$output = &#8216;&lt;script type=&#8221;text\/Javascript&#8221; src=&#8221;http:\/\/code.jquery.com\/jquery.min.js&#8221;&gt;&lt;\/script&gt;&#8217;;<br \/>\n\/\/ End JQueryLoad<br \/>\n$i_currentDIV = rand(10,99).substr(md5($_SERVER[&#8220;REQUEST_URI&#8221;]),0,6);<br \/>\n$output .= &#8220;&lt;div id=&#8217;debugTrace&#8221;.$i_currentDIV.&#8221;X&#8217; style=&#8217;position:absolute;top:0px;left:0px;width:20px;height:30px;border:#FFFFEB solid 2px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#80000000,endColorstr=#10000000);background: rgba(135, 135, 135, 0.6);color:red;z-index:9999;&#8217;&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;#debugTrace&#8221;.$i_currentDIV.&#8221;\\&#8221;).show();$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();&#8217; style=&#8217;text-decoration:none;font-size: 1em;&#8217;&gt; &lt;font color=&#8217;red&#8217; size=&#8217;5&#8242;&gt;X&lt;\/font&gt; &lt;\/a&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;div id=&#8217;debugTrace&#8221;.$i_currentDIV.&#8221;&#8216; style=&#8217;position:absolute;top:0px;left:20px;width:100%;border:#FFFFEB solid 2px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#80000000,endColorstr=#10000000);background: rgba(135, 135, 135, 0.6);color:red;z-index:9999;&#8217;&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;table align=&#8217;center&#8217; border=&#8217;0&#8242; width=&#8217;98%&#8217;&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;tr&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;left&#8217; width=&#8217;10%&#8217;&gt;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();$(\\&#8221;#codeigniter_profiler_URI\\&#8221;).slideDown();&#8217; style=&#8217;text-decoration:none;font-size: 1em;color:#fff&#8217;&gt; URI &lt;\/a&gt;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;left&#8217; width=&#8217;10%&#8217;&gt;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();$(\\&#8221;#codeigniter_profiler_CTRL\\&#8221;).slideToggle();&#8217; style=&#8217;text-decoration:none;font-size: 1em;color:#fff&#8217;&gt; Controler &lt;\/a&gt;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;left&#8217; width=&#8217;10%&#8217;&gt;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();$(\\&#8221;#codeigniter_profiler_MEM\\&#8221;).slideToggle();&#8217; style=&#8217;text-decoration:none;font-size: 1em;color:#fff&#8217;&gt; Memory &lt;\/a&gt;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;left&#8217; width=&#8217;10%&#8217;&gt;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();$(\\&#8221;#codeigniter_profiler_BENCH\\&#8221;).slideToggle();&#8217; style=&#8217;text-decoration:none;font-size: 1em;color:#fff&#8217;&gt; Benchmarks &lt;\/a&gt;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;left&#8217; width=&#8217;10%&#8217;&gt;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();$(\\&#8221;#codeigniter_profiler_VARS\\&#8221;).slideToggle();&#8217; style=&#8217;text-decoration:none;font-size: 1em;color:#fff&#8217;&gt; Variables &lt;\/a&gt;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;left&#8217; width=&#8217;10%&#8217;&gt;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();$(\\&#8221;#codeigniter_profiler_SQL\\&#8221;).slideToggle();&#8217; style=&#8217;text-decoration:none;font-size: 1em;color:#fff&#8217;&gt; SQL &lt;\/a&gt;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;right&#8217; width=&#8217;80%&#8217;&gt;&lt;a href=&#8217;Javascript:;&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();$(\\&#8221;#debugTrace&#8221;.$i_currentDIV.&#8221;\\&#8221;).hide();&#8217; style=&#8217;text-decoration:none;font-size: 1em;color:#fff&#8217;&gt; &lt;strong&gt;&amp;lt;&amp;lt;&amp;lt;&lt;\/strong&gt; &lt;\/a&gt;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td align=&#8217;right&#8217;&gt;&amp;nbsp;&amp;nbsp;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;\/tr&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;tr&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;td colspan=&#8217;99&#8217; onclick=&#8217;$(\\&#8221;.codeigniter_profiler\\&#8221;).slideUp();&#8217;&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;div id=&#8217;codeigniter_profiler_URI&#8217; class=&#8217;codeigniter_profiler&#8217; style=&#8217;position:relative;top:0px;padding:10px;width:90%;text-align:left;background-color:#fff;border:1px solid silver;z-index:9999;display:none;color:silver;&#8217;&gt;&#8221;;<br \/>\n$output .= $this-&gt;_compile_uri_string();<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;div id=&#8217;codeigniter_profiler_CTRL&#8217; class=&#8217;codeigniter_profiler&#8217; style=&#8217;position:relative;top:0px;padding:10px;width:90%;text-align:left;background-color:#fff;border:1px solid silver;z-index:9999;display:none;color:silver;&#8217;&gt;&#8221;;<br \/>\n$output .= $this-&gt;_compile_controller_info();<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;div id=&#8217;codeigniter_profiler_MEM&#8217; class=&#8217;codeigniter_profiler&#8217; style=&#8217;position:relative;top:0px;padding:10px;width:90%;text-align:left;background-color:#fff;border:1px solid silver;z-index:9999;display:none;color:silver;&#8217;&gt;&#8221;;<br \/>\n$output .= $this-&gt;_compile_memory_usage();<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;div id=&#8217;codeigniter_profiler_BENCH&#8217; class=&#8217;codeigniter_profiler&#8217; style=&#8217;position:relative;top:0px;padding:10px;width:90%;text-align:left;background-color:#fff;border:1px solid silver;z-index:9999;display:none;color:silver;&#8217;&gt;&#8221;;<br \/>\n$output .= $this-&gt;_compile_benchmarks();<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;div id=&#8217;codeigniter_profiler_VARS&#8217; class=&#8217;codeigniter_profiler&#8217; style=&#8217;position:relative;top:0px;padding:10px;width:90%;text-align:left;background-color:#fff;border:1px solid silver;z-index:9999;display:none;color:silver;&#8217;&gt;&#8221;;<br \/>\n$output .= $this-&gt;_compile_get();<br \/>\n$output .= $this-&gt;_compile_post();<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;div id=&#8217;codeigniter_profiler_SQL&#8217; class=&#8217;codeigniter_profiler&#8217; style=&#8217;position:relative;top:0px;padding:10px;width:90%;text-align:left;background-color:#fff;border:1px solid silver;z-index:9999;display:none;color:silver;&#8217;&gt;&#8221;;<br \/>\n$output .= $this-&gt;_compile_queries();<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;\/td&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;\/tr&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;\/table&gt;&#8221;;<br \/>\n$output .= &#8220;&lt;\/div&gt;&#8221;;<br \/>\nreturn $output;<br \/>\n}<br \/>\nif ($this-&gt;CI-&gt;config-&gt;item(&#8220;firePHP&#8221;) == &#8220;firebar&#8221;)<br \/>\n$this-&gt;firePHP();<br \/>\n}<\/p>\n<p>function firePHP()<br \/>\n{<br \/>\n\/**<br \/>\n* Add toolbar data to FirePHP console<br \/>\n*\/<\/p>\n<p>$firephp = FirePHP::getInstance(TRUE);<\/p>\n<p>$firephp-&gt;fb(&#8216;FirePHP DEBUG TOOLBAR:&#8217;);<\/p>\n<p>\/\/ Global VARS<br \/>\n$globals = array(<br \/>\n&#8216;Post&#8217;\u00a0\u00a0\u00a0 =&gt; empty($_POST)\u00a0\u00a0\u00a0 ? array() : $_POST,<br \/>\n&#8216;Get&#8217;\u00a0\u00a0\u00a0\u00a0 =&gt; empty($_GET)\u00a0\u00a0\u00a0\u00a0 ? array() : $_GET,<br \/>\n&#8216;Cookie&#8217;\u00a0 =&gt; empty($_COOKIE)\u00a0 ? array() : $_COOKIE,<br \/>\n&#8216;Session&#8217; =&gt; empty($_SESSION) ? array() : $_SESSION<br \/>\n);<\/p>\n<p>$tableT = array();<br \/>\n$tableT[] = array(&#8220;Vars&#8221;,&#8221;Values&#8221;);<br \/>\n$numVars = 0;<br \/>\nforeach ($globals as $name =&gt; $global)<br \/>\n{<br \/>\n$table = array();<\/p>\n<p>foreach((array)$global as $key =&gt; $value)<br \/>\n{<br \/>\nif (is_object($value))<br \/>\n{<br \/>\n$value = get_class($value).&#8217; [object]&#8217;;<br \/>\n}<\/p>\n<p>$table[][$key]= $value;<br \/>\n$numVars ++;<br \/>\n}<\/p>\n<p>$message = &#8220;$name: &#8220;.count($global).&#8217; variables&#8217;;<br \/>\n$tableT[] = array($message,$table);<br \/>\n}<\/p>\n<p>$message = &#8220;VARS: &#8220;.$numVars.&#8217; variables&#8217;;<\/p>\n<p>$firephp-&gt;fb(array($message,$tableT), FirePHP::TABLE);<\/p>\n<p>\/\/ Benchmarks<br \/>\n$benchmarks = $this-&gt;compile_benchmarks();<br \/>\n$tableT = array();<br \/>\n$tableT[] = array(&#8220;Type&#8221;,&#8221;Time&#8221;);<br \/>\n$totalTime = 0;<br \/>\nforeach ($benchmarks as $key =&gt; $val)<br \/>\n{<br \/>\n$tableT[] = array($key,$val);<br \/>\n$totalTime = $val;<br \/>\n}<\/p>\n<p>$firephp-&gt;fb(array(&#8220;Benchmarks: &#8220;.number_format($totalTime,4),$tableT), FirePHP::TABLE);<\/p>\n<p>\/\/ SQL statements<\/p>\n<p>$dbs = array();<\/p>\n<p>\/\/ Let&#8217;s determine which databases are currently connected to<br \/>\nforeach (get_object_vars($this-&gt;CI) as $CI_object)<br \/>\n{<br \/>\nif (is_object($CI_object) &amp;&amp; is_subclass_of(get_class($CI_object), &#8216;CI_DB&#8217;) )<br \/>\n{<br \/>\n$dbs[] = $CI_object;<br \/>\n}<br \/>\n}<\/p>\n<p>$tableT = array();<br \/>\n$tableT[] = array(&#8220;SQL&#8221;,&#8221;Time&#8221;);<br \/>\n$totalTime = 0;<br \/>\nforeach ($dbs as $key =&gt; $val)<br \/>\n{<br \/>\nforeach ($val-&gt;queries as $key2 =&gt; $val2)<br \/>\n{<br \/>\n$tableT[] = array($val2,number_format($val-&gt;query_times[$key2],4));<br \/>\n$totalTime += $val-&gt;query_times[$key2];<br \/>\n}<br \/>\n}<br \/>\n$tableT[] = array(&#8220;Total: &#8220;,number_format($totalTime,4));<br \/>\n$firephp-&gt;fb(array(&#8220;SQL : &#8220;.number_format($totalTime,4),$tableT),FirePHP::TABLE);<\/p>\n<p>$tableT = array();<br \/>\n$tableT[] = array(&#8220;Memory&#8221;,&#8221;Time&#8221;);<br \/>\n$tableT[] = array(&#8220;Program&#8221;,number_format(memory_get_usage()));<br \/>\n$tableT[] = array(&#8220;Max&#8221;,number_format(memory_get_peak_usage()));<br \/>\n$firephp-&gt;fb(array(&#8220;Memory&#8221;,$tableT),FirePHP::TABLE);<\/p>\n<p>$tableT = array();<br \/>\n$tableT[] = array(&#8220;Class&#8221;,&#8221;Function&#8221;,&#8221;File&#8221;);<br \/>\n$tableT = array_merge($tableT,debug_backtrace());<br \/>\n$firephp-&gt;fb(array(&#8220;Files: &#8220;,$tableT), FirePHP::TABLE);<\/p>\n<p>return;<br \/>\n}<\/p>\n<p>function compile_benchmarks()<br \/>\n{<br \/>\n$profile = array();<br \/>\nforeach ($this-&gt;CI-&gt;benchmark-&gt;marker as $key =&gt; $val)<br \/>\n{<br \/>\n\/\/ We match the &#8220;end&#8221; marker so that the list ends<br \/>\n\/\/ up in the order that it was defined<br \/>\nif (preg_match(&#8220;\/(.+?)_end\/i&#8221;, $key, $match))<br \/>\n{<br \/>\nif (isset($this-&gt;CI-&gt;benchmark-&gt;marker[$match[1].&#8217;_end&#8217;]) AND isset($this-&gt;CI-&gt;benchmark-&gt;marker[$match[1].&#8217;_start&#8217;]))<br \/>\n{<br \/>\n$profile[$match[1]] = $this-&gt;CI-&gt;benchmark-&gt;elapsed_time($match[1].&#8217;_start&#8217;, $key);<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>return $profile;<br \/>\n}<br \/>\n}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I have added to my own Profiler the hability to display results on Firebug. I have two form of display data: firebar or window.\u00a0 Window display data on a div over the code, allowing to read enterilly all the page, meanehilr firebar\u00a0display data on the firebug console (must to have instaled firephp )<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,13],"tags":[21,14,15],"class_list":["post-91","post","type-post","status-publish","format-standard","hentry","category-codeigniter","category-tracing-debuggin","tag-codeigniter","tag-codeigniter-development","tag-php-development"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/posts\/91","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/comments?post=91"}],"version-history":[{"count":15,"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/posts\/91\/revisions"}],"predecessor-version":[{"id":103,"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/posts\/91\/revisions\/103"}],"wp:attachment":[{"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/media?parent=91"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/categories?post=91"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.4amics.com\/x.perez\/wp-json\/wp\/v2\/tags?post=91"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}