<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[5552] sites/trunk/api.wordpress.org/public_html/events/1.0/index.php: Events: Move caching deeper into logic to restore broad cache hits</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/5552">5552</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/5552","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>iandunn</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2017-06-08 03:46:45 +0000 (Thu, 08 Jun 2017)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Events: Move caching deeper into logic to restore broad cache hits

Previously the caching was done at a higher level, for simplicity. At the time this was setup, Core would either pass the IP, _or_ the location search, but not both. So, the arguments passed to `get_location()` were unique enough to generate a cache key from.

That changed with [wp40774], and now Core always passes the IP, even if it's also passing a search query. Because of that, the arguments to `get_location()` are no longer distinct enough to use as cache keys. For example, a search for `Seattle` would generate a cache key that was tied to the IP address that was passed, which lowers the cache hits by several orders of magnitude.

With this commit, the caching is moved down a level, to the controllers for IP geolocation and geocoding. They are only passed the arguments that are needed for their respective queries, so the arguments are distinct enough to generate appropriate cache keys from.

Additionally, the value that gets cached when no location could be found was changed from `false` to `__NOT_FOUND__`, because `wp_cache_set()` / `wp_cache_get()` doesn't always appear to work when `$data` is boolean `false`.

Props dd32</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkapiwordpressorgpublic_htmlevents10indexphp">sites/trunk/api.wordpress.org/public_html/events/1.0/index.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkapiwordpressorgpublic_htmlevents10indexphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/api.wordpress.org/public_html/events/1.0/index.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/api.wordpress.org/public_html/events/1.0/index.php    2017-06-08 00:32:06 UTC (rev 5551)
+++ sites/trunk/api.wordpress.org/public_html/events/1.0/index.php      2017-06-08 03:46:45 UTC (rev 5552)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -205,12 +205,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return false|object false on failure; an object on success
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function guess_location_from_city( $location_name, $timezone, $country_code ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $guess = guess_location_from_geonames( $location_name, $timezone, $country_code );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ global $cache_group, $cache_life;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $cache_key = 'guess_location_from_city:' . md5( $location_name . ':' . $timezone . ':' . $country_code );
+       $guess     = wp_cache_get( $cache_key, $cache_group );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( $guess ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                if ( '__NOT_FOUND__' == $guess ) {
+                       return false;
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 return $guess;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $guess = guess_location_from_geonames( $location_name, $timezone, $country_code );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /*
</span><span class="cx" style="display: block; padding: 0 10px">         * Multi-word queries may contain cities, regions, and countries, so try to extract just the city
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -231,6 +240,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $guess     = guess_location_from_geonames( $city_name, $timezone, $country_code, $wildcard = false );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        wp_cache_set( $cache_key, ( $guess ?: '__NOT_FOUND__' ), $cache_group, $cache_life );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         return $guess;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -303,8 +314,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return false|object `false` on failure; an object on success
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function guess_location_from_ip( $dotted_ip ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        global $wpdb;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ global $wpdb, $cache_group, $cache_life;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $cache_key = 'guess_location_from_ip:' . $dotted_ip;
+       $location  = wp_cache_get( $cache_key, $cache_group );
+
+       if ( $location !== false ) {
+               if ( '__NOT_FOUND__' == $location ) {
+                       return false;
+               }
+
+               return $location;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $long_ip = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( filter_var( $dotted_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -318,6 +340,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( false === $long_ip || ! isset( $from, $where ) ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                wp_cache_set( $cache_key, '__NOT_FOUND__', $cache_group, $cache_life );
</ins><span class="cx" style="display: block; padding: 0 10px">                 return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -332,9 +355,12 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Unknown location:
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! $row || '-' == $row->country_short ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                wp_cache_set( $cache_key, '__NOT_FOUND__', $cache_group, $cache_life );
</ins><span class="cx" style="display: block; padding: 0 10px">                 return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        wp_cache_set( $cache_key, $row, $cache_group, $cache_life );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         return $row;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -443,14 +469,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> function get_location( $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px">        global $cache_life, $cache_group;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $cache_key = 'get_location:' . md5( serialize( $args ) );
-       $location  = wp_cache_get( $cache_key, $cache_group );
</del><span class="cx" style="display: block; padding: 0 10px">         $throttle_geonames = $throttle_ip2location = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( false !== $location ) {
-               return $location;
-       }
-
</del><span class="cx" style="display: block; padding: 0 10px">         // For a country request, no lat/long are returned.
</span><span class="cx" style="display: block; padding: 0 10px">        if ( isset( $args['country'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $location = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -458,8 +478,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $country_code = get_country_code_from_locale( $args['locale'] ?? '' );
-
</del><span class="cx" style="display: block; padding: 0 10px">         // Coordinates provided
</span><span class="cx" style="display: block; padding: 0 10px">        if (
</span><span class="cx" style="display: block; padding: 0 10px">                ! $location && (
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -482,6 +500,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return 'temp-request-throttled';
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $country_code = get_country_code_from_locale( $args['locale'] ?? '' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $guess = guess_location_from_city( $args['location_name'], $args['timezone'] ?? '', $country_code  );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $guess ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -534,10 +553,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $location !== 'temp-request-throttled' ) {
-               wp_cache_set( $cache_key, $location, $cache_group, $cache_life );
-       }
-
</del><span class="cx" style="display: block; padding: 0 10px">         return $location;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -578,6 +593,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return false|array false on failure; an array with country details on success
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function guess_location_from_country( $location_name ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        global $cache_group, $cache_life;
+
+       $cache_key = 'guess_location_from_country:' . $location_name;
+       $country   = wp_cache_get( $cache_key, $cache_group );
+
+       if ( $country ) {
+               if ( '__NOT_FOUND__' == $country ) {
+                       return false;
+               }
+
+               return $country;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         // Check if they entered only the country name, e.g. "Germany" or "New Zealand"
</span><span class="cx" style="display: block; padding: 0 10px">        $country             = get_country_from_name( $location_name );
</span><span class="cx" style="display: block; padding: 0 10px">        $location_word_count = str_word_count( $location_name );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -613,6 +641,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $country = get_country_from_name( $country_name );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        wp_cache_set( $cache_key, ( $country ?: '__NOT_FOUND__' ), $cache_group, $cache_life );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         return $country;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre>
</div>
</div>

</body>
</html>