I was able to reduce the calculation time from 13 seconds to 1 second!
I did this by filtering out with mysql the locations that were not within a 10 km bounding box of my lat/long coordinates.
I used this code:
$rad = 10; // radius of bounding circle in kilometers
$R = 6371; // earth's mean radius, km
// first-cut bounding box (in degrees)
$maxLat = $_GET['lat'] + rad2deg($rad/$R);
$minLat = $_GET['lat'] - rad2deg($rad/$R);
// compensate for degrees longitude getting smaller with increasing latitude
$maxLon = $_GET['long'] + rad2deg($rad/$R/cos(deg2rad($_GET['lat'])));
$minLon = $_GET['long'] - rad2deg($rad/$R/cos(deg2rad($_GET['lat'])));
and I changed my mysql to this:
$sql2 = "SELECT ....WHERE LAT BETWEEN '".$minLat."' AND '".$maxLat."'";
$sql3 = "SELECT ....WHERE LON BETWEEN '".$minLon."' AND '".$maxLon."'";
The rest of my code and calculation is exact the same, but instead of doing 3000 calculations, mysql sweeps out the majority.
I don't know if this approach is 100% mathematically correct, but as far as I see it works very fast with minor changes to my initial coding so for my project it's great.
And of course, the source: http://www.movable-type.co.uk/scripts/latlong-db.html