tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#a-new-data-model-for-50000-articles')" >A new data model for 50,000 articles
I started by drawing up a new relational model for the site, which already held over fifty thousand articles. The client wanted to drop classifieds entirely, refocus on news and advertising, and reorganize the content so articles could sit in several categories, and categories could sit inside other categories as "aliases". I modelled that as a nested set, with Doctrine doing the heavy lifting.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#from-five-hours-to-eleven-seconds')" >From five hours to eleven seconds
With the traffic Easier's logs showed, the MySQL database had to be properly optimized, with Symfony's caching backed by memcached, partial and full page caching included. Search started out on Zend Lucene, which every other Symfony project on our books used, and was fine on test fixtures. Once I migrated the real data it clearly wasn't going to cope. I swapped it for Sphinx, which runs as its own process and keeps its index current with deltas. A full index rebuild went from over five hours to under eleven seconds.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#also-in-the-build')" >Also in the build
Clean URLs and semantic, search engine friendly markup
Thumbnails generated with ImageMagick
Its own cloud server on Rackspace, as part of moving Wired Media's sites to the cloud, configured with Puppet