<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>juust ~ php oddities &#187; optimisation</title>
	<atom:link href="http://www.juust.org/index.php/tag/optimisation/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.juust.org</link>
	<description>Link theory and search engine optimization</description>
	<lastBuildDate>Thu, 19 Jan 2012 09:39:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>spot the bot</title>
		<link>http://www.juust.org/index.php/spot-a-bot/2009/09/</link>
		<comments>http://www.juust.org/index.php/spot-a-bot/2009/09/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 09:10:25 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[optimisation]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=837</guid>
		<description><![CDATA[I have some overhead scripts fetching data that can cost a few seconds extra loading time. Having traffic trigger tasks saves me the trouble of using cron-jobs, but I don&#8217;t want to run overhead scripts with visitors or googlebot on &#8230; <a href="http://www.juust.org/index.php/spot-a-bot/2009/09/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have some overhead scripts fetching data that can cost a few seconds extra loading time. Having traffic trigger tasks saves me the trouble of using cron-jobs, but I don&#8217;t want to run overhead scripts with visitors or googlebot on the site. Apart from that, some routines can use a lot of resources which are wasted on some crawlers.</p>
<p>I actually want the crawlers to come around, so I will make an array with bots and allowed_bots. Whatever is not on the white-list gets a meager page with overhead jobs attached to it, the rest (iow visitors and the big search engines) get the standard page. </p>
<p>There are truckloads of bots (see <a href="http://www.crawltrack.fr/">crawltrack</a>), for my purposes a few regulars will do. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//hook it into &#39;init&#39;, run when calling script</span></div>
</li>
<li class="li1">
<div class="de1">add_action<span class="br0">&#40;</span> <span class="st0">&#39;init&#39;</span><span class="sy0">,</span> <span class="st0">&#39;spotabot&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* checks if visitor is a bot</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* This method checks the http_user_agent string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* to see if the visitors is a non-essential bot</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @param void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @return void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;if(IS_A_BAD_BOT) {}</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> spotabot<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$bot_list</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;Teoma&quot;</span><span class="sy0">,</span> <span class="st0">&quot;betaBot&quot;</span><span class="sy0">,</span> <span class="st0">&quot;alexa&quot;</span><span class="sy0">,</span> <span class="st0">&quot;froogle&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Gigabot&quot;</span><span class="sy0">,</span> <span class="st0">&quot;inktomi&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;looksmart&quot;</span><span class="sy0">,</span> <span class="st0">&quot;URL_Spider_SQL&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Firefly&quot;</span><span class="sy0">,</span> <span class="st0">&quot;NationalDirectory&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Ask Jeeves&quot;</span><span class="sy0">,</span> <span class="st0">&quot;TECNOSEEK&quot;</span><span class="sy0">,</span> <span class="st0">&quot;InfoSeek&quot;</span><span class="sy0">,</span> <span class="st0">&quot;WebFindBot&quot;</span><span class="sy0">,</span> <span class="st0">&quot;girafabot&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;crawler&quot;</span><span class="sy0">,</span> <span class="st0">&quot;www.galaxy.com&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Googlebot&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Scooter&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Slurp&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;msnbot&quot;</span><span class="sy0">,</span> <span class="st0">&quot;appie&quot;</span><span class="sy0">,</span> <span class="st0">&quot;FAST&quot;</span><span class="sy0">,</span> <span class="st0">&quot;WebBug&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Radian6&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Spade&quot;</span><span class="sy0">,</span> <span class="st0">&quot;ZyBorg&quot;</span><span class="sy0">,</span> <span class="st0">&quot;rabaz&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Baiduspider&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Feedfetcher-Google&quot;</span><span class="sy0">,</span> <span class="st0">&quot;TechnoratiSnoop&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Rankivabot&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Mediapartners-Google&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Sogou web spider&quot;</span><span class="sy0">,</span> <span class="st0">&quot;WebAlta Crawler&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$bot_allowed</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;Googlebot&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Feedfetcher-Google&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Mediapartners-Google&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Slurp&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Baiduspider&quot;</span><span class="sy0">,</span> <span class="st0">&quot;msnbot&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$bot_list</span> <span class="kw1">as</span> <span class="re1">$bot</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="st0">&quot;x&quot;</span><span class="sy0">.</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;HTTP_USER_AGENT&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="re1">$bot</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">&gt;</span><span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$bot_allowed</span> <span class="kw1">as</span> <span class="re1">$okbot</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$okbot</span><span class="sy0">==</span><span class="re1">$bot</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&quot;IS_A_BAD_BOT&quot;</span><span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&quot;IS_A_BAD_BOT&quot;</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&quot;IS_A_BAD_BOT&quot;</span><span class="sy0">,</span> <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In templates and functions i can use some simple code to run stuff conditional :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">defined</span><span class="br0">&#40;</span><span class="st0">&#39;IS_A_BAD_BOT&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>IS_A_BAD_BOT<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;hi bot&lt;br /&gt;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; run_time_consuming_overhead_tasks<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; and_omit_the_sidebar<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;hello wonderful visitor&lt;br /&gt;&quot;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//if it is not defined it is not a bot or the function ain&#39;t present, </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//I am lazy and sloppy and don&#39;t want a code-break</span></div>
</li>
</ol>
</div>
<p>It would be nice if WordPress built in a switch to run plugins conditional.</p>
<p><em>one related smart plugin is the <a href="http://indiafascinates.com/chennai/chennaicentral/">chennai central</a> plugin that sends 304 not modified headers on conditional GETs, so crawlers don&#8217;t fetch the page. That can save some bandwidth and serverload.<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/spot-a-bot/2009/09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hands on xml-rpc : copying msql tables</title>
		<link>http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/</link>
		<comments>http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 17:13:41 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=286</guid>
		<description><![CDATA[I don&#8217;t have anything to blog on, so I will bore you all with a quick generic function to copy mysql tables from one host to another, using xml-rpc. I use the Incutio xml-rpc library on both hosts, to handle &#8230; <a href="http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t have anything to blog on, so I will bore you all with a quick generic function to copy mysql tables from one host to another, using xml-rpc. </p>
<p>I use the <a href="http://scripts.incutio.com/xmlrpc/manual.php" rel="nofollow" title="Incutio xml rpc class manual">Incutio xml-rpc library</a> on both hosts, to handle the tedious stuff (xml formatting and parsing). That leaves only some snippets to send and receive table data and store it on a mysql database. </p>
<p>First : how to handle the table data on the sending end:</p>
<ul>
<li>I take an associative array from a mysql query</li>
<li>I make an array to hold the records </li>
<li>I add each row as array</li>
<li>I make an IXR-client.</li>
<li>I add some general parameters</li>
<li>I hand these and the entire table array to my IXR-client.</li>
<li>send&#8230;</li>
</ul>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//the snippet with the client is at the bottom of the post</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span> <span class="sy0">=</span> <span class="kw2">New</span> SerpClient<span class="br0">&#40;</span><span class="st0">&#39;http://serp.trismegistos.net/db/xmlrpc.php&#39;</span><span class="sy0">,</span> <span class="st0">&#39;user&#39;</span><span class="sy0">,</span> <span class="st0">&#39;pass&#39;</span><span class="sy0">,</span> <span class="st0">&#39;sender&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$tablename</span> <span class="sy0">=</span> <span class="st0">&quot;serp_tags_keys&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$tableid</span> <span class="sy0">=</span> <span class="st0">&quot;id&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$serpdb</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT * FROM &quot;</span><span class="sy0">.</span><span class="re1">$tablename</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$recordcount</span> <span class="sy0">=</span> <span class="kw3">mysql_num_rows</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">=</span><span class="kw3">mysql_fetch_assoc</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$record</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$row</span> <span class="kw1">as</span> <span class="re1">$key</span> <span class="sy0">=&gt;</span> <span class="re1">$value</span><span class="br0">&#41;</span> <span class="re1">$record</span><span class="br0">&#91;</span><span class="re1">$key</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$value</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$records</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$record</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span><span class="sy0">-&gt;</span><span class="me1">putTable</span><span class="br0">&#40;</span><span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$recordcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$records</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p><em>I consider some additional fields necessary for basic integrity checks : I add &#8220;ID&#8221; as key field, so on the receiving end the server knows which field is my table&#8217;s auto-increment field. Other fields are a username, password, tablename and the batch recordcount.</em> </p>
<p>The IXR_Client then generates a tangled mess of xml-tags holding the entire prodecure call and data. (you can put the client on &#8216;debug&#8217;, then it dumps the generated xml to the screen).</p>
<p>The first part of the xml file contains the single parameters :</p>
<ul>
<li>username</li>
<li>password</li>
<li>tablename</li>
<li>recordcount</li>
<li>id-field</li>
</ul>
<p>&lt;methodCall&gt;<br />
&lt;methodName&gt;serp.putTable&lt;/methodName&gt;<br />
&lt;params&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;user&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;pass&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;serp_tags_keys&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;int&gt;91&lt;/int&gt;&lt;/value&gt;&lt;/param&gt;<br />
&lt;param&gt;&lt;value&gt;&lt;string&gt;id&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;</p>
<p>Then the entire table is sent as one parameter in the procedure call. </p>
<p>That parameter is built from an array containing the table rows as &#8216;struct&#8217;. If I want to use the routine for any table, I need the fieldname-value pairs to compose a standard mysql insert statement. A struct type allows me to use <em>key-value</em> pairs in the xml-file that can be parsed back into an array. </p>
<p>&lt;param&gt;&lt;value&gt;&lt;array&gt;</p>
<p>&lt;data&gt;</p>
<p>  &lt;value&gt;&lt;struct&gt;<br />
  &lt;member&gt;&lt;name&gt;id&lt;/name&gt;&lt;value&gt;&lt;string&gt;4&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;tag&lt;/name&gt;&lt;value&gt;&lt;string&gt;ranking&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;cat&lt;/name&gt;&lt;value&gt;&lt;string&gt;alexa ranking seo internet ranking internet positi&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;date&lt;/name&gt;&lt;value&gt;&lt;string&gt;200901&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
&lt;/struct&gt;&lt;/value&gt;</p>
<p>  &lt;value&gt;&lt;struct&gt;<br />
  &lt;member&gt;&lt;name&gt;id&lt;/name&gt;&lt;value&gt;&lt;string&gt;94&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;tag&lt;/name&gt;&lt;value&gt;&lt;string&gt;firm&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;cat&lt;/name&gt;&lt;value&gt;&lt;string&gt;firm seo&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
  &lt;member&gt;&lt;name&gt;date&lt;/name&gt;&lt;value&gt;&lt;string&gt;200901&lt;/string&gt;&lt;/value&gt;&lt;/member&gt;<br />
&lt;/struct&gt;&lt;/value&gt;</p>
<p>&lt;/data&gt;</p>
<p>&lt;/array&gt;&lt;/value&gt;&lt;/param&gt;</p>
<p>That was the last of the param holding the table, so the entire tag-mess is closed :</p>
<p>&lt;/params&#038;gt&lt;/methodCall&#038;gt</p>
<p>Then the second part : on the receiving end the Incutio class parses the whole tag-mess, and hands an array of the param sections as input to my function putTable. </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> putTable<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$user</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$pass</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$tname</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$tcount</span> &nbsp;<span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$id</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$table</span> &nbsp; <span class="sy0">=</span> <span class="re1">$args</span><span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>$table is a straightforward array holding as items an array ($t) created from the struct with the pairs of fieldname-value. I turn the recordsets key-value struct into a mysql INSERT query :<br />
$query = &#8220;INSERT INTO `&#8221;.$tname.&#8221;` (&#8221; field, field&#8230; &#8220;) VALUES (&#8221; fieldvalue, fieldvalue &#8220;)&#8221;;</p>
<p>All I have to do is add the fieldnames and fieldvalues to the mysql insert query.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$table</span> <span class="kw1">as</span> <span class="re1">$t</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the fixed parts</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query0</span> <span class="sy0">=</span> <span class="st0">&#39;INSERT INTO `&#39;</span><span class="sy0">.</span><span class="re1">$tname</span><span class="sy0">.</span><span class="st0">&#39;` (&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query2</span> <span class="sy0">.=</span><span class="st0">&quot;) VALUES (&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make the (`fieldname`, `fieldname`, `fieldname`) query-bit </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//and the (&#39;fieldvalue&#39;, &#39;fieldvalue&#39;, &#39;fieldvalue&#39;) query-bit :</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$t</span> <span class="kw1">as</span> <span class="re1">$key</span><span class="sy0">=&gt;</span><span class="re1">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$key</span><span class="sy0">!=</span><span class="re1">$id</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$query1</span> <span class="sy0">.=</span><span class="st0">&quot;`&quot;</span><span class="sy0">.</span><span class="re1">$key</span><span class="sy0">.</span><span class="st0">&quot;`, &quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$query3</span> <span class="sy0">.=</span><span class="st0">&quot;&#39;&quot;</span><span class="sy0">.</span><span class="re1">$value</span><span class="sy0">.</span><span class="st0">&quot;&#39;, &quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//remove the trailing &quot;, &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query1</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$query1</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$query1</span><span class="br0">&#41;</span><span class="nu0">-2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query3</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$query3</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$query3</span><span class="br0">&#41;</span><span class="nu0">-2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//glue em up and add the final &quot;)&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query0</span> <span class="sy0">.=</span> <span class="re1">$query1</span><span class="sy0">.</span><span class="re1">$query2</span><span class="sy0">.</span><span class="re1">$query3</span><span class="sy0">.</span><span class="st0">&quot;)&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//query&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">connection</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="re1">$query0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//reset the strings</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query0</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query1</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query2</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query3</span><span class="sy0">=</span><span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>that generates mysql queries like<br />
<em>INSERT INTO `serp_tags_keys` (`tag`, `cat`, `date`) VALUES (&#8216;ranking&#8217;, &#8216;alexa ranking&#8217;, &#8217;200901&#8242;)</em> and copies the entire table.</p>
<p>That is how I handle the table data. </p>
<p>Of course I have to define two custom classes to process the <em>serp.putTable</em> procedure itself, using the Incutio class.</p>
<p>First the class for the sending script, which is pretty straight forward : </p>
<ul>
<li>make an IXR_Client instance</li>
<li>hand the record set to it</li>
<li>
have it formatted and sent</li>
</ul>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//include the library</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&#39;class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make a custom class that uses the IXR_client</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">Class</span> SerpClient </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$rpcurl</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//endpoint</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$username</span><span class="sy0">;</span> &nbsp; <span class="co1">//you go figure</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$password</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$bClient</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp;<span class="co1">//incutio ixr-client instance</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> <span class="re1">$myclient</span><span class="sy0">;</span> &nbsp;<span class="co1">//machine/host-id</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> SerpClient<span class="br0">&#40;</span><span class="re1">$rpcurl</span><span class="sy0">,</span> <span class="re1">$username</span><span class="sy0">,</span> <span class="re1">$password</span><span class="sy0">,</span> <span class="re1">$myclient</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rpcurl</span> <span class="sy0">=</span> <span class="re1">$rpcurl</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">connect</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="co1">//Standard variables to send in the message</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rpcurl</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$rpcurl</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$username</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">password</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$password</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">myclient</span> <span class="sy0">=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re1">$myclient</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw2">function</span> connect<span class="br0">&#40;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//basic client, it takes the endpoint url, tests and returns true if it exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">bClient</span> <span class="sy0">=</span> <span class="kw2">new</span> IXR_Client<span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">rpcurl</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the function I use to send the data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> putTable<span class="br0">&#40;</span><span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$recordcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$array</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//first parameter is always the methodname, then the parameters, which are</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//added sequential to the xml-file (with the appropriate tags for datatypes.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the script figures that out. note : it uses htmlentities on strings.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">bClient</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#39;serp.putTable&#39;</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">password</span><span class="sy0">,</span> <span class="re1">$tablename</span><span class="sy0">,</span> <span class="re1">$recordcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$array</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I use it in the snippets above with :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span> <span class="sy0">=</span> <span class="kw2">New</span> SerpClient<span class="br0">&#40;</span><span class="st0">&#39;http://serp.trismegistos.net/db/xmlrpc.php&#39;</span><span class="sy0">,</span> <span class="st0">&#39;user&#39;</span><span class="sy0">,</span> <span class="st0">&#39;pass&#39;</span><span class="sy0">,</span> <span class="st0">&#39;sender&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$ThisClient</span><span class="sy0">-&gt;</span><span class="me1">putTable</span><span class="br0">&#40;</span><span class="re1">$tname</span><span class="sy0">,</span> <span class="re1">$tcount</span><span class="sy0">,</span> <span class="re1">$tableid</span><span class="sy0">,</span> <span class="re1">$records</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Then, on the receiving end, my program has to know how to handle the xml containing the remote procedure call. </p>
<p>I define an extension on IXR_server and pass serp.putTable as new &#8216;method&#8217; (callback function).</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//go away cookie&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$_COOKIE</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make sure you get the posted crap, the ixr instances grabs it input from it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span> <span class="st0">&#39;php://input&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re1">$HTTP_RAW_POST_DATA</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$HTTP_RAW_POST_DATA</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//include the library</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&#39;class-IXR.php&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make an extended class</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> serp_xmlrpc_server <span class="kw2">extends</span> IXR_Server <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//use the same function name&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> serp_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//build an array of methods : </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//first the procedurename you use in the xml-text,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//then which function in the extended class (this one) it maps to </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//to be used as $this-&gt;method</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;serp.putTable&#39;</span> &nbsp;<span class="sy0">=&gt;</span> <span class="st0">&#39;this:putTable&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//hand em to the IXR server instance that will map it as callback</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">IXR_Server</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">methods</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//now IXR_Server instance uses ($this-&gt;)putTable </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//to process incoming xml-text </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//containing serp.putTable as methodname</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">function</span> putTable<span class="br0">&#40;</span><span class="re1">$args</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//(for routine : see the snippet above to store the xml data in mysql)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make the class instance like any regular get-post php program, </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the only actual program line, that instantiates the extended class,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//which handles the posted xml </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$serp_xmlrpc_server</span> <span class="sy0">=</span> <span class="kw2">new</span> serp_xmlrpc_server<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s all. I am not going to list a cut-and-paste version. You have to build some stuff with it, then you will come up with lots of stuff you can do with it. </p>
<p>WordPress and iPhone built a plugin that receives pictures from iPhone. WordPress uses Incutio so you can &#8216;piggyback&#8217; on that and have an iPhone plugin for your own website in two days flat using an ajax lightbox gallery script. Or go monetize small websites with some seo oriented &#8216;optimisation&#8217; functions like ChangeFooterLinks(array($paidurl, $anchortext)) :) or whatever&#8230; boring, isn&#8217;t it ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/xml-rpc-copy-mysql-table/2009/01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>synonymizer with api</title>
		<link>http://www.juust.org/index.php/synonymizer-with-api/2008/12/</link>
		<comments>http://www.juust.org/index.php/synonymizer-with-api/2008/12/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 12:09:46 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[optimization]]></category>
		<category><![CDATA[seo tips and tricks]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=172</guid>
		<description><![CDATA[If you want to put some old content on the net and have it indexed as fresh unique content, this works wonders for seo-friendly backlinks : the automated synonymizer. I want one that makes my content unique without having to &#8230; <a href="http://www.juust.org/index.php/synonymizer-with-api/2008/12/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you want to put some old content on the net and have it indexed as fresh unique content, this works wonders for seo-friendly backlinks : the automated synonymizer. I want one that makes my content unique without having to type one character.</p>
<p>Lucky for me, mister <a href="http://words.bighugelabs.com/" rel="nofollow">John Watson&#8217;s synonym database</a> comes with a free 10.000 request a day API and boy is it sweet! </p>
<p>API Requests are straightforward :<br />
http://words.bighugelabs.com/api/2/[<a href="http://words.bighugelabs.com/api.php" rel="nofollow">apikey</a>]/[keyword]/xml</p>
<p>A number of return formats are supported but xml is easiest, either for parsing with simplexml or regular pattern matching.</p>
<p>It returns on request :<br />
<strong>black</strong> (slightly shortened)<br />
an xml file like :<br />
&lt;words&gt;<br />
&lt;w p=&#8221;adjective&#8221; r=&#8221;syn&#8221;&gt;bleak&lt;/w&gt;<br />
&lt;w p=&#8221;adjective&#8221; r=&#8221;syn&#8221;&gt;sinister&lt;/w&gt;<br />
&lt;w p=&#8221;adjective&#8221; r=&#8221;sim&#8221;&gt;dark&lt;/w&gt;<br />
&lt;w p=&#8221;adjective&#8221; r=&#8221;sim&#8221;&gt;angry&lt;/w&gt;<br />
&lt;w p=&#8221;noun&#8221; r=&#8221;syn&#8221;&gt;blackness&lt;/w&gt;<br />
&lt;w p=&#8221;noun&#8221; r=&#8221;syn&#8221;&gt;inkiness&lt;/w&gt;<br />
&lt;w p=&#8221;verb&#8221; r=&#8221;syn&#8221;&gt;blacken&lt;/w&gt;<br />
&lt;w p=&#8221;verb&#8221; r=&#8221;syn&#8221;&gt;melanize&lt;/w&gt;<br />
&lt;/words&gt;</p>
<p>&#8230;which is easiest handled with preg_match_all :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> getsynonyms<span class="br0">&#40;</span><span class="re1">$keyword</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$pick</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apikey</span> <span class="sy0">=</span> <span class="st0">&#39;get your own key&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$xml</span><span class="sy0">=</span><span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="st0">&#39;http://words.bighugelabs.com/api/2/&#39;</span><span class="sy0">.</span><span class="re1">$apikey</span><span class="sy0">.</span><span class="st0">&#39;/&#39;</span><span class="sy0">.</span><span class="re1">$keyword</span><span class="sy0">.</span><span class="st0">&#39;/xml&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$xml</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="re1">$pick</span><span class="sy0">;</span> <span class="co1">//return empty array</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">preg_match_all</span><span class="br0">&#40;</span><span class="st0">&#39;/&lt;w p=&quot;adjective&quot; r=&quot;syn&quot;&gt;(.*?)&lt; <span class="es0">\/</span>w&gt;/&#39;</span><span class="sy0">,</span> <span class="re1">$xml</span><span class="sy0">,</span> <span class="re1">$adj_syns</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//preg_match_all(&#39;/&lt;/w&gt;&lt;w p=&quot;adjective&quot; r=&quot;sim&quot;&gt;(.*?)&lt; \/w&gt;/&#39;, $xml, $adj_sims);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//preg_match_all(&#39;/&lt;/w&gt;&lt;w p=&quot;noun&quot; r=&quot;syn&quot;&gt;(.*?)&lt; \/w&gt;/&#39;, $xml, $noun_syns);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//preg_match_all(&#39;/&lt;/w&gt;&lt;w p=&quot;verb&quot; r=&quot;syn&quot;&gt;(.*?)&lt; \/w&gt;/&#39;, $xml, $verb_syns);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$adj_syns</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="kw1">as</span> <span class="re1">$adj_syn</span><span class="br0">&#41;</span> <span class="re1">$pick</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$adj_syn</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//same for verb/noun synonyms, I just want adjectives</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="re1">$pick</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>w<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>practically applying it,<br />
I take a slab of stale old content and&#8230;</p>
<ul>
<li>strip tags</li>
<li>do a regular match on all alphanumeric sequences dropping other stuff</li>
<li>trim the resulting array elements</li>
<li>(merge all blog tags, categories, and a list of common words)</li>
<li>excluding common terms from the array with text elements</li>
<li>excluding words smaller than N characters</li>
<li>set a percentage words to be synonimized</li>
<li>attempt to retrieve synonyms for remaining terms</li>
<li>replace these words in the original text, keep count</li>
<li>when I reach the target replacement percentage, abort</li>
<li>return (hopefully) a revived text</li>
</ul>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> synonymize<span class="br0">&#40;</span><span class="re1">$origtext</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//make a copy of the original text to dissect</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$content</span><span class="sy0">=</span><span class="re1">$origtext</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//content = $this-&gt;body;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$perc</span><span class="sy0">=</span><span class="nu0">3</span><span class="sy0">;</span> &nbsp; <span class="co1">//target percentage changed terms</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$minlength</span><span class="sy0">=</span><span class="nu0">4</span><span class="sy0">;</span> &nbsp;<span class="co1">//minimum length candidates</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$maxrequests</span><span class="sy0">=</span><span class="nu0">80</span><span class="sy0">;</span> <span class="co1">//max use of api-requests</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//dump tags </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$content</span> <span class="sy0">=</span> &nbsp;<span class="kw3">strip_tags</span><span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//dump non-alphanumeric string characters</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$content</span> <span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st0">&#39;/[^A-Za-z0-9<span class="es0">\-</span>]/&#39;</span><span class="sy0">,</span> <span class="st0">&#39; &#39;</span><span class="sy0">,</span> <span class="re1">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//explode on blank space</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$wrds</span> <span class="sy0">=</span> <span class="kw3">explode</span><span class="br0">&#40;</span><span class="st0">&#39; &#39;</span><span class="sy0">,</span> <span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//trim off blank spaces just in case</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">for</span><span class="br0">&#40;</span><span class="re1">$w</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><span class="re1">$w</span><span class="sy0">&lt;</span>count <span class="br0">&#40;</span><span class="re1">$wrds</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="re1">$w</span><span class="sy0">++</span><span class="br0">&#41;</span> <span class="re1">$words</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$wrds</span><span class="br0">&#91;</span><span class="re1">$w</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//this should be all words</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$wordcount</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re1">$words</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//how many words do I want changed ?</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$toswitch</span> <span class="sy0">=</span> <span class="kw3">round</span><span class="br0">&#40;</span><span class="re1">$wordcount</span><span class="sy0">*</span><span class="re1">$perc</span><span class="sy0">/</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//only use uniques</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$words_unique</span><span class="sy0">=</span><span class="kw3">array_unique</span><span class="br0">&#40;</span><span class="re1">$words</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//sort, start with words at the end of the text </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">sort</span><span class="br0">&#40;</span><span class="re1">$words_unique</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//merge common with tags, categories, linked_tags</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$common</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;never&quot;</span><span class="sy0">,</span> <span class="st0">&quot;about&quot;</span><span class="sy0">,</span> <span class="st0">&quot;price&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//note : setting the minlength to 4 excludes lots of common terms</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">for</span><span class="br0">&#40;</span><span class="re1">$i</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><span class="re1">$i</span><span class="sy0">&lt;</span>count<span class="br0">&#40;</span><span class="re1">$words_unique</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="re1">$i</span><span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//if in common array, not selectable for synonymizing</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re1">$words_unique</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re1">$common</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">//only terms bigger than minlength</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$words_unique</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">&gt;</span><span class="re1">$minlength</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">//words_select contains candidates for synonyms</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$words_select</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$words_unique</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//terms that can be changed</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$max</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re1">$words_select</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//no more requests than max</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$max</span><span class="sy0">&gt;</span><span class="re1">$maxrequests</span><span class="br0">&#41;</span> <span class="re1">$max</span><span class="sy0">=</span><span class="re1">$maxrequests</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">for</span><span class="br0">&#40;</span><span class="re1">$i</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><span class="re1">$i</span><span class="sy0">&lt;</span> <span class="re1">$max</span><span class="sy0">;</span><span class="re1">$i</span><span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//get synonyms, give server some time</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">usleep</span><span class="br0">&#40;</span><span class="nu0">100000</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">//retrieve synonyms etc.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$these_words</span> <span class="sy0">=</span> getsynonyms<span class="br0">&#40;</span><span class="re1">$words_select</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$jmax</span><span class="sy0">=</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re1">$these_words</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$jmax</span><span class="sy0">&amp;</span>lt<span class="sy0">;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">//no results</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$count</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$j</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//the replacements are done in the original text</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$origtext</span><span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st0">&#39;/&#39;</span><span class="sy0">.</span><span class="re1">$words_select</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&#39;/i&#39;</span><span class="sy0">,</span> <span class="re1">$these_words</span><span class="br0">&#91;</span><span class="re1">$j</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re1">$origtext</span><span class="sy0">,</span> <span class="nu0">-1</span><span class="sy0">,</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re1">$total_switched</span><span class="sy0">+=</span><span class="re1">$count</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="co1">//have we reached the percentage ? </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re1">$total_switched</span><span class="sy0">&gt;=</span><span class="re1">$toswitch</span><span class="br0">&#41;</span> <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//okay!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="re1">$origtext</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> getsynonyms<span class="br0">&#40;</span><span class="re1">$keyword</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$pick</span><span class="sy0">=</span><span class="kw3">array</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apikey</span> <span class="sy0">=</span> <span class="st0">&#39;get your own key at bighugelabs.com&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$xml</span><span class="sy0">=@</span><span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="st0">&#39;http://words.bighugelabs.com/api/2/&#39;</span><span class="sy0">.</span><span class="re1">$apikey</span><span class="sy0">.</span><span class="st0">&#39;/&#39;</span><span class="sy0">.</span><span class="kw3">urlencode</span><span class="br0">&#40;</span><span class="re1">$keyword</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&#39;/xml&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="re1">$xml</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="re1">$pick</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">preg_match_all</span><span class="br0">&#40;</span><span class="st0">&#39;/&lt;w p=&quot;adjective&quot; r=&quot;syn&quot;&gt;(.*?)&lt; <span class="es0">\/</span>w&gt;/&#39;</span><span class="sy0">,</span> <span class="re1">$xml</span><span class="sy0">,</span> <span class="re1">$adj_syns</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$adj_syns</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="kw1">as</span> <span class="re1">$adj_syn</span><span class="br0">&#41;</span> <span class="re1">$pick</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re1">$adj_syn</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="re1">$pick</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>w<span class="sy0">&gt;&lt;/</span>count<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>Nothing fancy, a straightforward search-replace routine. A 1200 word text has about 150 candidates and for 3% synonyms I need to replace 36 words, it can do that. If I were to use it for real I would build a table with non-returning terms, and store often used terms, that would speed up the synonimizing, allow the use of preferences and take a load of the api use.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/synonymizer-with-api/2008/12/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cache WordPress on IIS</title>
		<link>http://www.juust.org/index.php/wordpress-cache-on-iss/2008/08/</link>
		<comments>http://www.juust.org/index.php/wordpress-cache-on-iss/2008/08/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 21:24:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[seo]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=111</guid>
		<description><![CDATA[If you run WordPress on an IIS Windows server with FastGGI and WordPress is slow, you will need a cache to speed it up and might run into some problems, if so : check out WP-Cache up and running on &#8230; <a href="http://www.juust.org/index.php/wordpress-cache-on-iss/2008/08/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you run WordPress on an IIS Windows server with FastGGI and WordPress is slow, you will need a cache to speed it up and might run into some problems, if so : check out<br />
<a rel="nofollow" href="http://fanrastic.com/archives/2007/06/06/wp-cache-up-and-running-on-iis/">WP-Cache up and running on IIS</a> on fanrastic.com. A very simple explanation on how to get the Wp-Cache plugin for WordPress running on an IIS windows host, and it works.</p>
<p><strong>Why use a cache ?</strong></p>
<p>Most people skip sites with long load-times, speeding up load times with a cache is a &#8216;must-have&#8217; if you plan to develop and optimize a site aimed at getting your traffic through a search engine</p>
<p>I installed Google Analytics a week ago and that affirms it, the rate of people that skipped this site after one page was 85% compared to 15% on another domain with normal load times. Pages took 4 seconds or more to load without a cache, and 1.5 seconds or less with a cache. Average page per visitor was 1.14 for this site and 5.8 for the other.</p>
<p>For advertising purposes, long loading time means a site is unattractive to advertisers. You don&#8217;t bind visitors and the &#8216;bad rep&#8217; your site gets also reflects on advertisers, especially with banner ads that work more visual/emotional (image and experience are linked and the poor performance of the site reflects on the advertisers).</p>
<p><a rel="nofollow" href="http://www.webslug.info/index/slowest">Webslug</a> keep a list on slow loading sites, some of them really extreme with 5 minutes load times. Some sites use a five second boundary, sites with higher loading times are considered unacceptable for advertising programs.</p>
<p>A cache also decreases server-load (which isn&#8217;t the foremost reason for wordpress bloggers to install it) and allows for a higher concurrent traffic volume, especially if you become popular with a few dozen visitors at the same time, your server overloads.</p>
<p>Loads of reasons to install a cache.</p>
<p>&#8212;&#8212;&#8211;</p>
<p>added 14-09</p>
<p>One other reason is MySql, which can handle 2500 concurrent connections but only about 50 concurrent users, problems arise when you for instance have a large file table or registered user table, that for indexing builds a temporary index table (the &#8216;digg&#8217;-effect where a sudden massive rush on the site makes mysql opt out).</p>
<p>Using any caching mechanism diminishes the load on the mysql server which  effectively solves most problems with the site slowing down. For wordpress, removing unnecessary plug-ins helps, as does a page-cache.But neither solves the actual problem, the mysql database interaction.</p>
<p>WordPress-MU might in time deliver the goods, a stable mysql query caching mechanism, and for now it seems the &#8216;ease-of-use&#8217; and the simplicity of the source-code dictate a page-cacher will have to do for the standalone version.</p>
<p>So depending on your plans with a website, where WordPress is the ideal tool for a site with up to, say, 1000 pages, if you plan on a larger business strength site use a CMS that does have backend mysql query-caching.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/wordpress-cache-on-iss/2008/08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>monkey business</title>
		<link>http://www.juust.org/index.php/monkey-business/2008/07/</link>
		<comments>http://www.juust.org/index.php/monkey-business/2008/07/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 02:11:52 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[optimisation]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=70</guid>
		<description><![CDATA[monkey business I cached my monkeys, so it don&#8217;t take so long to retrieve pictures every time, and added a size switch. where can you retrieve the width of the sidebar the widget instance is in ? Anyways, when I &#8230; <a href="http://www.juust.org/index.php/monkey-business/2008/07/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p class="note" style="text-align: center;">monkey business</p>
<p>I cached my monkeys, so it don&#8217;t take so long to retrieve pictures every time, and added a size switch. where can you retrieve the width of the sidebar the widget instance is in ?</p>
<p>Anyways, when I figured the cache thing out, i reckoned hey, lets cache the serp, so then I cached the serp, now it keeps a &#8216;current&#8217; file and an archive. works half.</p>
<p>at least my pages don&#8217;t take an aeon to load anymore.</p>
<p>tomorrow : more monkey business.</p>
<p><img src="http://www.juust.org/wp-content/images/2679639610_0055eec108_m.jpg" alt="ape beasty" width="375px" height="300px" rel="nofollow"/> &#8230;that is a cute ape</p>
<h4>tag links</h4>
<p><strong><em><a href="http://www.seoquake.com/" rel="nofollow" title="seoquake browser plugin seo tool kit">SeoQuake</a></em></strong> indicates my second blog has 52 inside links and 14 outbound, 66 links, but my blog is not ranking. </p>
<p>I ran a spider on the site that counts all the anchors (also double links), that reports 120 anchors. </p>
<p>Google  possibly exclude anything with 100+ anchors.</p>
<p>I just counted the links manually and found about 50 links, so i wondered &#8216;where are the other 70?&#8217;. So i counted the tag-cloud and realized &#8216;damn.. the tags&#8230;&#8217;. What causes it are the tags per post (the main cause) and the number of posts listed on the frontpage. If i use 10 posts per page I easily have (10*4) 40 tag-links, and if google counts &#8216;em all for onr link and ditches my page I loose the page linking the two blogs. The whole second blog becomes a closed ring with no way out so the entire blog is excluded from page ranking.</p>
<p>I turned the posts per page down to max 3 posts (<em>settings</em>, <em>reading</em>), and  removed the &#8216;recent posts&#8217; widget from the sidebar. Now its down to about 80 links.</p>
<p>If that is all true then tomorrow or by sunday both blogs should start ranking again.</p>
<p>A quick spidering shows the main blog is on 2.20, pages on 1.80, posts on 0.60, and the second blog on 0.60, only the rss feed still has the feed url on &#8216;follow&#8217; but that&#8217;s a minor detail.</p>
<p>That should score quite nicely.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/monkey-business/2008/07/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>google guidelines</title>
		<link>http://www.juust.org/index.php/google-guidelines/2008/07/</link>
		<comments>http://www.juust.org/index.php/google-guidelines/2008/07/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 21:48:39 +0000</pubDate>
		<dc:creator>juust</dc:creator>
				<category><![CDATA[seo]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.juust.org/?p=27</guid>
		<description><![CDATA[best &#8220;10-ways&#8221; article on the net : 10 ways to score in the search engines : Design and content guidelines (7-2008) Make a site with a clear hierarchy and text links. Every page should be reachable from at least one &#8230; <a href="http://www.juust.org/index.php/google-guidelines/2008/07/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>best &#8220;10-ways&#8221; article on the net : 10 ways to score in the search engines :</p>
<p><a title="google webmaster guidelines" rel="nofollow" href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;answer=35769" target="_blank">Design and content guidelines</a> (7-2008)</p>
<ul>
<li> Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link.</li>
<li> Offer a site map to your users with links that point to the important parts of your site. If the site map is larger than 100 or so links, you may want to break the site map into separate pages.</li>
<li> Create a useful, information-rich site, and write pages that clearly and accurately describe your content.</li>
<li> Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.</li>
<li> Try to use text instead of images to display important names, content, or links. The Google crawler doesn&#8217;t recognize text contained in images.</li>
<li> Make sure that your TITLE tags and ALT attributes are descriptive and accurate.</li>
<li> Check for broken links and correct HTML.</li>
<li> If you decide to use dynamic pages (i.e., the URL contains a &#8220;?&#8221; character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them few.</li>
<li> Keep the links on a given page to a reasonable number (fewer than 100).</li>
</ul>
<p>[ad#banner]</p>
<p>Quality &#8211; basic principles</p>
<ul>
<li> Make pages primarily for users, not for search engines. Don&#8217;t deceive your users or present different content to search engines than you display to users, which is commonly referred to as <em>cloaking</em>.</li>
<li> Avoid tricks intended to improve search engine rankings. A good rule of thumb is whether you&#8217;d feel comfortable explaining what you&#8217;ve done to a website that competes with you. Another useful test is to ask, &#8220;Does this help my users? Would I do this if search engines didn&#8217;t exist?&#8221;</li>
<li> Don&#8217;t participate in link schemes designed to increase your site&#8217;s ranking or PageRank. In particular, avoid links to web spammers or &#8220;bad neighborhoods&#8221; on the web, as your own ranking may be affected adversely by those links.</li>
<li> Don&#8217;t use unauthorized computer programs to submit pages, check rankings, etc. Such programs consume computing resources and violate our Terms of Service. Google does not recommend the use of products such as WebPosition Gold™ that send automatic or programmatic queries to Google.</li>
</ul>
<p>[ad#banner]</p>
<p>Here&#8217;s the &#8220;bad-things&#8221; list :</p>
<ul>
<li>Avoid hidden text or hidden links.</li>
<li>Don&#8217;t use cloaking or sneaky redirects.</li>
<li>Don&#8217;t send automated queries to Google.</li>
<li>Don&#8217;t load pages with irrelevant keywords.</li>
<li>Don&#8217;t create multiple pages, subdomains, or domains with substantially duplicate content.</li>
<li>Don&#8217;t create pages with malicious behavior, such as phishing or installing viruses, trojans, or other badware.</li>
<li>Avoid &#8220;doorway&#8221; pages created just for search engines, or other &#8220;cookie cutter&#8221; approaches such as affiliate programs with little or no original content.</li>
<li>If your site participates in an affiliate program, make sure that your site adds value. Provide unique and relevant content that gives users a reason to visit your site first.</li>
</ul>
<p>[post is on noindex, nofollow]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juust.org/index.php/google-guidelines/2008/07/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

