Статьи

Сохранение ресурсов с помощью PHPCache

Базы данных являются впечатляющими инструментами — использование одной из них на задней части вашего веб-сайта может дать вам огромные возможности с точки зрения гибкости и обслуживания. База данных эффективно отделяет ваш контент от дизайна, позволяя вам редактировать один, не затрагивая другой. Это в сочетании с разработкой новых языков сценариев, таких как PHP, и бесплатных баз данных, таких как MySQL, привело к росту популярности сайтов, управляемых базами данных.

Однако, несмотря на то, что веб-сайты на основе баз данных предлагают много преимуществ по сравнению со своими традиционными статическими аналогами, у динамического сайта есть два основных недостатка. Во-первых, люди склонны использовать строки запроса (что-либо после «?» В URL), чтобы передавать правильную информацию в свои сценарии. Такой подход может создать проблемы с поисковыми системами, однако, есть несколько решений этой проблемы .

Вторая проблема с динамическим сайтом заключается в том, что он может создавать высокую нагрузку на сервер, и по мере роста популярности вашего сайта он может замедляться из-за увеличения числа выполняемых запросов к базе данных. В этой статье мы рассмотрим решение этой проблемы — внедрение системы кэширования для вашего сайта.

Существуют разные способы уменьшить нагрузку на сервер, создаваемый вашим сайтом. Некоторые рекомендуют использовать статические, а не динамические страницы, а также периодический запуск скрипта или программы, которая генерирует новую статическую страницу. Этот подход работает — но что, если вы все еще хотите, чтобы некоторые элементы динамически отображались на рассматриваемой странице?

Ну, вы могли бы написать скрипт, который периодически генерирует другой скрипт. Например, вместо использования сценария PHP для создания файла HTML, вы можете использовать сценарий PHP для создания другого сценария PHP. В таком случае сгенерированный сценарий вызовет меньшую нагрузку на сервер, чем его родитель. Хотя этот подход может быть успешным, он также может создать больше работы — вам нужно написать другой скрипт для генерации каждой страницы, которую вы запускаете, используя эту технику. Кроме того, если вы решите сгенерировать HTML-страницы, а потом передумаете, вам, возможно, придется подождать месяц или больше, чтобы все новые страницы были проиндексированы поисковыми системами. И в это время вы можете легко потерять свои результаты рейтинга.

Вместо этого, почему бы не использовать систему кэширования? Этот инструмент позволяет вам кэшировать части вашего скрипта, такие как запросы к базе данных, в то время как другие элементы остаются полностью динамическими. Итак, как вы пишете систему кеширования? Ну, вам не нужно, потому что Натан на 0x00.org написал отличную систему и выпустил ее под лицензией General Public License. Эта статья научит вас, как установить и использовать этот скрипт на вашем собственном сайте.

Установка phpCache

Сначала скачайте скрипт . Разархивируйте его — единственный файл, который вам нужен, это phpCache.inc. Просматривайте другие включенные файлы на досуге: они могут дать вам идеи о различных способах использования сценария, но для целей этой статьи они не нужны.

После того, как вы извлекли файл, попробуйте переименовать его. Это плохая идея, чтобы поместить любой скрипт, который не заканчивается подходящим расширением файла, в любую публичную область на вашем сервере. Это связано с тем, что в этом файле может содержаться конфиденциальная информация, и если пользователь попытается получить к нему прямой доступ, он сможет: если файл не имеет правильного расширения, код внутри него будет отображаться в браузере. , Поэтому рекомендуется переименовать файл с расширением .php или сохранить его в каталоге над корневым общедоступным каталогом.

Есть несколько вещей, которые вам нужно отредактировать внутри самого файла. Откройте файл в вашем любимом текстовом редакторе и найдите следующую строку:

define(CACHE_DIR, "/tmp/phpCache/"); 

Если у вас нет собственного сервера, вам придется редактировать этот код. Вы должны создать каталог tmp над корневым каталогом html, а внутри него поместить каталог phpCache. Затем введите путь к вашему новому каталогу, например:

 define(CACHE_DIR, "/home/username/tmp/phpCache/"); 

Если вы не знаете путь к вашему каталогу, обратитесь к администратору сервера или войдите в сеанс оболочки и используйте команду pwd.

Другая вещь, которую вам, возможно, потребуется отредактировать, — это функция клавиш. phpCache использует ключ для хранения кэшированных данных. Ключ генерируется по умолчанию с использованием переменных GET и POST, а также строки запроса. Если вы используете другой метод для передачи информации на ваши динамические страницы, вам нужно отредактировать эту функцию, чтобы учесть эти переменные.

Возможно, вы используете две переменные: $PATH_INFO or $REQUEST_URI — если вы используете их, измените cache_default_key() (находится в файле phpCache.inc) на следующую:

 function cache_default_key() {  global $HTTP_GET_VARS, $QUERY_STRING, $PATH_INFO,  $REQUEST_URI;  return md5("GET=" . serialize($HTTP_GET_VARS) . "QS=" .  $QUERY_STRING . "PATH_INFO=" . $PATH_INFO . "REQUEST_URI=" .  $REQUEST_URI);  } 

В качестве альтернативы вы можете указать, что вы хотите использовать для ключа, если вы решите использовать функцию cache() вместо cache_all() при выполнении кэширования. Вы также можете выбрать ключ кеша на основе чего-то другого, например, первичного ключа базы данных, если вы используете функцию cache() . Подробнее об этом позже.

После того, как вы загрузили файл, вам нужно будет включить его в начало сценариев PHP, в которых вы хотите его использовать, например:

 include("../phpCache.inc"); 

Теперь, когда вы установили сценарий и поместили его в сценарии, с которыми хотите его использовать, давайте узнаем, как использовать его для кэширования ваших данных.

Настройка функции кэширования

Есть одна основная функция, с которой вы должны быть знакомы — это cache() . Эта функция принимает три параметра: время, объект и ключ, и используется следующим образом:

 if (!($et=cache(time, object, key))){  .  .  .  endcache();  } 

В первой строке выше используется переменная $et определенная скриптом кэширования, чтобы проверить, доступен ли кэш. Если нет, то блок кода, который следует за ним, будет выполнен. Именно в этом блоке кода вам нужно включить информацию, которую вы хотите кэшировать (например, запросы к вашей базе данных). Наконец, endcache() функция endcache() , которая сохраняет и закрывает кеш. Ваши данные не будут сохранены без функции endcache() , поэтому обязательно endcache() ее.

Есть одна важная деталь, которую вы должны знать, прежде чем настроить ее на своей странице. Если вы будете выполнять какие-либо запросы вне кэша, в дополнение к тем, которые вы будете выполнять внутри кэша, не устанавливайте соединение с базой данных в кешированном блоке кода. Вместо этого поместите его над блоком кода — таким образом ваши некешированные запросы все равно будут выполняться.

Теперь нам нужно заполнить аргументы для функции cache() . Первый аргумент, time, довольно прост: это продолжительность кеша в секундах. Вы можете установить этот аргумент на любое число, от 60 секунд до 6 миллионов секунд. Если вы установите аргумент time равным 0, кеш никогда не истечет.

Следующие аргументы действительно работают вместе, так как они оба используются для хранения и идентификации кэшированных данных. Аргумент объекта обычно содержит имя или URL скрипта. Ключевой аргумент обычно содержит идентификатор, который не связан с именем скрипта, таким как строка запроса, переменные формы или первичный ключ из вашей базы данных, как обсуждалось выше. Для хранения и извлечения ваших кэшированных данных phpCache будет перекрестно ссылаться на объект и ключ.

Существует также другая функция для кэширования, называемая cache_all() , которая может использоваться следующим образом:

 if (!($et=cache_all(time))){  .  .  .  endcache();  } 

Очевидная разница с этой функцией заключается в том, что она принимает только один аргумент, время. Причина, по которой у него нет аргумента объекта или ключа, заключается в том, что он использует значения по умолчанию для этих полей. Значения по умолчанию генерируются двумя функциями, которые вы найдете в файле phpCache.inc . Один, cache_default_key() , мы упоминали выше. Эта функция генерирует ключ на основе переменных формы и строки запроса. Объект по умолчанию генерируется cache_default_object() и просто возвращает хост и имя файла скрипта.

Во многих случаях вы можете использовать эти значения по умолчанию. Было исключение, о котором я говорил выше, когда вы можете редактировать или просто не использовать ключ по умолчанию, а в случаях, когда вы хотите совместно использовать одни и те же кэшированные данные на нескольких страницах, вам не нужно использовать объект по умолчанию. Эти атрибуты могут быть легко заменены на любой выбранный вами идентификатор.

Кэширование ваших запросов к базе данных

Вы должны сделать больше, чем просто поместить ваши запросы к базе данных в блок кода кэширования, чтобы они были кэшированы. Вы все равно должны конкретно cache_variable() информацию, которую вы хотите кэшировать, и для этого мы используем cache_variable() .

Функция cache_variable() принимает один аргумент: имя переменной, которую вы хотите кэшировать. Это можно использовать так:

 cache_variable("variablename"); // the variable $variablename  has been cached 

Это, конечно, нужно поместить в блок кода кэширования.

Технически, это вся информация, необходимая для работы этого скрипта. Однако, поскольку у некоторых из вас могут возникнуть проблемы с переходом от кэширования одной переменной к кэшированию результатов нескольких запросов, я хотел бы поделиться своим конкретным методом для этого.

Кэшировать запрос к базе данных, который возвращает одну строку, очень просто — вы можете просто кэшировать каждое поле независимо — но это становится более сложным, когда ваша база данных возвращает несколько строк. Конечно, вы не хотите кэшировать каждую переменную в наборе результатов 100 строк независимо? Для кэширования результатов, состоящих из нескольких строк, мы используем массивы — в частности, две замечательные функции, называемые array_push() и array_walk() .

Допустим, у вас есть сайт, управляемый статьями, и вы хотите кэшировать список всех авторов, а также их электронные письма и все, что вы используете в качестве первичного ключа (мы просто скажем id). Для кеширования такого запроса вы можете сделать что-то вроде этого:

 $result_authors = mysql_query("SELECT first_name, last_name, email, id  FROM authors ORDER BY last_name", $db);  if (!$result_authors) {  echo("<p>Error performing author query: " . mysql_error() . "</p>");  exit();  } // run the query and do error checking  $authors = array(); // create the array  // extract the query data into array $main  while ($main = mysql_fetch_array($result_authors)){  // use array push to insert a result set row into our array  array_push($authors, $main);  }  cache_variable("authors"); // cache your array  mysql_free_result($result_authors); 

Большая часть этого должна быть знакома вам. Если вам нужна помощь с тем, как подключиться, чтобы выполнить запрос к базе данных с помощью PHP, я предлагаю вам прочитать серию статей Кевина Янка, которая достаточно подробно описывает эту тему.

То, что я собираюсь объяснить, это array_push() . Эта функция принимает два аргумента: первый — имя массива, который вы хотите использовать, а второй — данные, которые вы хотите поместить в массив. Все, что действительно делает функция — это берет эти данные и помещает их в следующую доступную строку в массиве. Что я делаю, это помещаю каждую строку результатов в наш массив $authors author, и, поскольку вся информация о базе данных содержится в одной переменной — нашем массиве, — мы можем легко ее кэшировать с помощью функции cache_variable() .

Теперь мы подошли ко второй функции массива, которую я упомянул, array_walk() . В то время как array_push() отлично подходит для вставки одной строки в массив за раз, array_walk() идеально подходит для запуска функции из одной строки в массиве за раз.

Чтобы извлечь данные из вашего кэшированного массива, вам нужно использовать array_walk() где вы хотите, чтобы данные появлялись на вашей странице:

 if($authors){ // if the array exists  print("<p><h2>Authors</h2>");  // array walk the array $authors through the function print_authors();  array_walk($authors, 'print_authors');  print("</p>");  } 

Функция array_walk() также принимает два аргумента: первый — это массив, который вы хотите использовать, а второй — функция, которой вы хотите передать каждый элемент массива. Также, как и выше, выражение «if» здесь совершенно необязательно, если вы знаете, что $authors всегда будет существовать и содержать массив. Это включено в этом случае, потому что заголовок «Авторы» может выглядеть глупо, если на самом деле не было авторов (либо потому, что в базе данных не было авторов, либо потому, что кэш был потерян или поврежден).

Теперь в приведенном выше примере я использую функцию print_authors() . Это пользовательская функция, которую вы должны определить где-то выше в своем PHP-скрипте. Некоторые люди любят помещать все свои функции в отдельный файл и затем включать его, что является хорошим решением, если вы будете использовать одну и ту же функцию на нескольких страницах. В противном случае вершина вашего PHP-скрипта — это хорошее место для определения функций.

В этом конкретном примере функция может выглядеть так:

 function print_authors($authors){  // extract  the data from our array  $first_name = $authors["first_name"];  $last_name = $authors["last_name"];  $email = $authors["email"];  $id = $authors["id"];  // print the author's information  print("<li><a href = "mailto:$email">$id: $last_name,  $first_name</a><br/>");  } 

Все в вышеупомянутой функции должно быть знакомо. Здесь мы просто извлекаем информацию из базы данных из массива, который мы создали выше.

Реализуйте это!

Вы должны иметь возможность реализовать этот скрипт на своем сайте прямо сейчас, если вы еще не начали. Если вы ссылаетесь на пример, который я изложил выше, он должен показать вам весь код, необходимый для запуска и запуска этой системы. Если у вас возникнут какие-либо проблемы, заходите на форумы SitePoint и не бойтесь обращаться за помощью.