Changed method of displaying random Gallery2 image to bypass DNS performance issues

Yeah, I know this probably will not make much sense to most people other than those dealing with something similar.

In the past I had been using PHP’s CURL functionality to obtain and display a random gallery image on both my main website and blog. The code I used was similar to the following:

$ch = curl_init();
$timeout = 10; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, 'http://gallery.markheadrick.com/main.php?g2_view=imageblock.External&g2_blocks=randomImage&g2_linkTarget=_blank&g2_show=title|date|views';);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
if ($file_contents != false) {
   echo $file_contents;
} else {
   echo '
<div class="small">Error, exceeded '
.$timeout.' second connection timeout.</div>

'
."\n";
}

This method worked fine; however, every now and then it would take several seconds to complete causing the webpages to display that much slower. After much investigation from when I started noticing this many months ago, I determined that the delay was being caused by the amount of time it was taking the server to look-up the IP address of gallery.markheadrick.com. I used the following bit of code to test this with:

function getmicrotime()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}

$port_starttime = getmicrotime();
$fp = @fsockopen('gallery.markheadrick.com', 80, $errno, $errstr, 10);
if (!$fp)
{
    echo "Offline ".number_format((getmicrotime() - $port_starttime), 4)." seconds\n";
}
else
{
    echo "Online ".number_format((getmicrotime() - $port_starttime), 4)." seconds\n";
    fclose($fp);
}

All this does is show the amount of time it takes to make a connection. Normally this should be a fraction of a second (0.0843 seconds for example). Well, on occasion this would take 4, 5 or more seconds to complete. If I used the server’s IP address instead of gallery.markheadrick.com, it would always take a fraction of a second (0.0001 seconds). So, the only difference was the system trying to determine what the IP address of gallery.markheadrick.com was. Similar behavior was displayed when I connected to google.com vs its IP address. In order for CURL to work, I had to supply it with gallery.markheadrick.com as the server has many domains and sub-domains associated with the same IP address.

Over time I’ve submitted numerous support tickets concerning this hostname look-up delay as the problem has surfaced, been fixed, and then resurfaced for whatever reason.

A couple days ago it started happening again and I submitted a new support ticket concerning it which more or less went nowhere and told them to just forget about it and close it.

Since my gallery is on the same server as my website and blog, I thought I should be able to obtain an image directly using PHP and MySQL; however, after looking at Gallery2’s database schema, this was going to be more difficult than I had thought. I then wondered if I could simply include some part of the Gallery code that dealt with the ImageBlock code that displays a random image. Then, I wondered if I could just include Gallery’s main PHP file and somehow feed it the variable values it needed to work. The following is what I eventually ended up with:

$_GET['g2_view'] = 'imageblock.External';
$_GET['g2_blocks'] = 'randomImage';
$_GET['g2_show'] = 'title|date|views';
$_GET['g2_linkTarget'] = '_blank';
ob_start();
include_once ($_SERVER['DOCUMENT_ROOT'].'/gallery/main.php');
$gallery_ob = ob_get_contents(); // Gets the contents of the output buffer
ob_end_clean(); // Ends capture and cleans the buffer so that it will not be displayed
$gallery_ob = str_replace('http://www.markheadrick.com/d/','http://gallery.markheadrick.com/d/',$gallery_ob);
$gallery_ob = str_replace('http://www.markheadrick.com/v/','http://gallery.markheadrick.com/v/',$gallery_ob);
echo $gallery_ob;

Hallelujah!! It worked! 🙂 During my search for answers the following two articles/threads helped me out the most: I want “include” to return a string instead of writing directly into the page. and [SOLVED] Get arguments in include function. Because I was including the code under a different sub-domain, it was using the wrong URL for the image and link. This is why I needed to add the two str_replace functions. On my blog, it was trying to load the image from blog.markheadrick.com instead of gallery.markheadrick.com. I also had to increase the amount of memory PHP could use for scripts on my blog from 32M to 64M.