3 способа ускорить работу вашего сайта с помощью PHP

23 января 2018

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

1. Объединение CSS с PHP

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

Подготовка

Прежде чем мы сможем оптимизировать файлы CSS, нам понадобится некоторый CSS для работы! Итак, давайте сделаем три файла и поместим в них некоторый CSS.

	// main.cssn	// Just some sample CSSn	n	body {n		width: 800px;n		margin: 0 auto;n		color: grey;n	}n	n	#wrapper {n		margin-top: 30px;n		background: url(../images/cats.png);n	}
	// typography.cssn	// Just some sample CSSn	n	body {n		font-family: Arial, san-serif;n		font-weight: bold;n	}n	n	strong {n		font-size: 120%;n	}
	// forms.cssn	// Just some sample CSSn	n	form {n		position: relative;n		top: 400px;n		z-index: 99;n	}n	n	input {n		height: 50px;n		width: 400px;n	}

PHP

Нам нужно получить содержимое этих файлов и добавить их друг к другу в указанном порядке. Поэтому наш скрипт должен получать имена файлов CSS по параметрам URL, открывать все файлы и складывать их вместе. Ниже приводится объяснение кода.

$file) {n $files[$key] = str_replace(array('/', '', '.'), '', $file);n}n$cssData = '';n foreach ($files as $file) {n $cssFileName = $cssPath. $file. '.css';n $fileHandle = fopen($cssFileName, 'r');n $cssData.= "n". fread($fileHandle, filesize($cssFileName));n fclose($fileHandle);n}n}// Tell the browser that we have a CSS file and send the data.nheader("Content-type: text/css");nif (isset($cssData)) {n echo $cssData;n echo "// Generated: ". date("r");n} else {n echo "// Files not avalable or no files specified.";n}n?>

Ломать его

Это выглядит довольно сложно, но держитесь за меня, это действительно довольно просто.

$file) {n $files[$key] = str_replace(array('/', '', '.'), '', $file);n}

Этот кусок кода задает путь для папки CSS и проверяет, что нам были отправлены некоторые файлы для работы. Путь CSS должен иметь завершающие слэши, иначе мы столкнемся с ошибками в bucket-load. Если бы мы хотели, мы могли бы автоматически проверять косую черту и добавлять ее, если это необходимо. Однако, для простоты я пропустил это поведение.

Далее мы проверяем каждое имя файла и удаляем все полные остановки и или слэши. Это не позволяет людям перемещаться по файловой системе, передавая имена файлов, такие как «.... secret file».

	$cssData = '';n	foreach ($files as $file) {n		$cssFileName = $cssPath . $file . '.css';n		$fileHandle = fopen($cssFileName, 'r');n		$cssData .= "n" . fread($fileHandle, filesize($cssFileName));n		fclose($fileHandle);n	}n}

Теперь нам нужно собрать данные CSS из отдельных файлов. Для этого мы прокручиваем массив файлов с помощью foreach, открываем каждый файл и добавляем содержимое к нашим данным. «N» просто добавляет новый символ линии, чтобы сохранить все красивое и аккуратное. Функция filesize () используется, чтобы найти длину файла, чтобы мы могли указать fread (), сколько мы хотим (весь файл).

// Tell the browser that we have a CSS file and send the data.nheader("Content-type: text/css");nif (isset($cssData)) {n	echo $cssData;n	echo "// Generated: " . date("r");n} else {n	echo "// Files not avalable or no files specified.";n}n?>

Последний бит скрипта - отправить данные CSS в браузер. Это означает, что мы должны сказать PHP, что мы отправляем данные CSS, и что он должен информировать браузер. Мы делаем это с помощью функции заголовка, задавая тип содержимого «text css». Затем мы отправляем CSS клиенту. Сначала мы проверяем, есть ли какие-либо данные CSS для отправки. Если этого не происходит, значит это означает, что имена файлов CSS не были отправлены. Если это так, мы просто отвечаем комментарием CSS. Если, однако, у нас есть некоторые данные для отправки, мы отправляем их и добавляем сообщение с подробным описанием, когда оно было сгенерировано. Если вы хотели, например, добавить некоторую информацию об авторских правах во все свои CSS за один раз, это было бы идеальным местом.

Ввод его в тест

Хорошо, теперь пришло время проверить скрипт; нам нужно сначала создать структуру каталогов, а затем поместить наши скрипты и файлы CSS. Посмотрите на изображение ниже и попытайтесь воспроизвести эту структуру. Если вы хотите что-то другое, не забудьте изменить пути, чтобы отразить эти изменения.

Когда все будет в нужном месте, мы сможем проверить наш скрипт. Структура каталогов должна быть помещена в папку «htdocs» или «www» веб-сервера с PHP (практически в любой веб-сервер в наши дни). Перейдите в файл index.php. Вы должны быть встречены одним комментарием: «Файлы недоступны или не указаны файлы». Это означает, что мы не даем никаких файлов, чтобы он мог сблизиться. Однако хорошей новостью является то, что это допустимый комментарий CSS и не вызовет никаких проблем.

Давайте дадим кое-что немного сложнее; введите «index.php? q [] = main», вы должны получить CSS из файла main.css и уведомление внизу.

Если мы хотим собрать несколько файлов (так как это действительно была целая часть сценария), мы можем отправить этот запрос: 'index.php? Q [] = main &q [] = forms'. Как вы можете видеть, мы можем повторить «q [] =» столько раз, сколько хотим, потому что оно добавляет каждое значение в массив. Вы могли бы добавить 50 файлов CSS вместе, если хотите использовать этот скрипт.

Заключение

Использование этого метода может быть очень полезным и может обеспечить такие преимущества, как возможность иметь таблицу стилей по умолчанию для каждой страницы и дополнительный файл CSS для страниц с формами. Это также легко реализовать, если вы уже используете какую-то обработку CSS с PHP. Если вы хотите, вы даже можете переименовать index.php в index.css до тех пор, пока вы настроите.htaccess для обработки файлов CSS как PHP.

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

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

2. Удаление пробелов из HTML и CSS

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

Браузеры отображают только одно пространство независимо от того, сколько вкладок вы используете в своем коде. Это означает, что есть некоторая потерянная полоса пропускания. Тем не менее, с помощью некоторого простого PHP мы можем удалить пропущенные пробелы с пропускной способностью.

Подготовка

Еще раз нам понадобятся некоторые исходные данные для работы; поэтому скопируйте следующий пример кода HTML и CSS. Сохраните следующее в файле.htm и.css в папке в каталоге webroot вашего сервера.

Эй, страница!
Lorem Ipsum dol...
body {n	min-height: 800px;n	background: black;n	font-size: 18px;n}#wrapper {n	width: 960px;n	margin: 20px auto;n	padding: 15px;n}#header h1 {n	text-indent: -99999em;n	background: url(../images/header.png);n	display: block;n	width: 100%;n	height: 48px;n}#mainbody {n	font-weight: bold;n}

PHP

Одним из преимуществ этого метода является то, что один и тот же скрипт будет работать как с HTML, так и с CSS. Наш скрипт должен принять имя файла как часть запроса. Как только файл загружен, он должен удалить все пробелы до одного пробела. Это потому, что мы не хотим удалять все пробелы между словами!

Еще раз, здесь есть куча PHP, но я тщательно рассмотрю его.

Наличие более близкого взгляда

Это не так сложно, но мы все равно разобьем его и постараемся понять, что происходит.

Мы получаем имя файла через параметр, переданный с запросом GET, и проверяем, чтобы он был разрешенным типом файла. Затем мы переходим к извлечению данных и обработке их для удаления лишних пробелов. Этот метод относительно примитивен и не удалит все лишние пробелы, но он будет иметь дело с большей частью всего лишь в нескольких строках кода!

Этот фрагмент просто устанавливает некоторые переменные. Еще раз, мы передаем наши данные через «q», так как это красиво и коротко. Это также дает нам возможность определить наш каталог для файлов и извлечь расширение файла. Функция explode () разрывает имя файла всякий раз, когда видит «.». и помещает бит в массив.

if ($ext != 'css' AND $ext != 'htm' AND $ext != 'html') {n	//Check for evil people...n	die('Hackers...!');n} else {

Здесь мы проверяем, чтобы файл был либо CSS, либо HTML. Если бы это было что-то еще, мы могли бы найти хакеров дыру в нашем сайте, как показать им settings.php! Поэтому, после того, как хакеры перешли на обработку наших данных, мы можем перейти к ним!

	//Lets get down to businessn	$handle = fopen($fileName, 'r');n	$fileData = fread($handle, filesize($fileName));n	//Now for some regex wizzardry!n	$newData = preg_replace('/s+/', ' ', $fileData);n	fclose($handle);n	//Time to output the data.n	if ($ext == 'css') {n		header("Content-type: text/css");n	}n	echo $newData;n}n?>

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

Наконец, мы отправляем данные, устанавливая требуемые заголовки, если мы имеем дело с CSS.

Но работает ли это?

Если вы заходите в свой браузер и переходите к «index.php? Q = css.css», мы должны увидеть одну строку CSS на странице. Это показывает, что все в порядке! Мы также можем увидеть тот же эффект на исходный код для примера html. Фактически в этом маленьком примере мы уменьшили файл CSS с 314 символами до 277 символов и файл html размером 528 символов до 448 символов. Неплохо для 15 строк кода.

Заключение

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

3. Кэширование в PHP-скриптах

В этой части я покажу вам, как «модифицировать» кеширование в ваши скрипты, используя приведенный выше сценарий в качестве примера. Цель состоит в том, чтобы ускорить процесс, не регенерируя данные каждый раз, когда кто-то запрашивает файл. Создание контента каждый запрос - это просто отходы, особенно по статическим данным, таким как наш CSS.

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

Разрыв потока

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

Включение в действие

Теперь мы действительно напишем код для кэширования в этот скрипт. Сначала я покажу, что скрипт завершен, а затем просматривайте каждую часть.

(time () - 86400)) {n $ cacheHandle = fopen ($ cacheName, 'r');$ newData = fread ($ cacheHandle, filesize ($ cacheName));fclose ($ cacheHandle);$ isCached = TRUE; n} else {n Позволяет перейти к businessn $ handle = fopen ($ fileName, 'r');$ fileData = fread ($ handle, filesize ($ fileName));Теперь для некоторого regex wizardry!$ newData = preg_replace ('s +', '', $ fileData);fclose ($ handle);Lets cache!$ cacheHandle = fopen ($ cacheName, 'w +');fwrite ($ cacheHandle, $ newData);fclose ($ cacheHandle);$ isCached = FALSE; n}Время вывода данныхif ($ ext == 'css') {n header ("Content-type: text css");if ($ isCached) {n echo "Получено из файла кеша. n"; n} n} else {n if ($ isCached) {n echo '';n}n}n echo $newData;n n}n?>

Объяснение

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

$cacheName = './cache/' . $nameExplode[0] . $nameExplode[1] . '.tmp';

Этот бит кода просто получает имя и расширение файла, склеивает их вместе и добавляет каталог кеша и соответствующее расширение «.tmp».

	if (file_exists($cacheName) AND filemtime($cacheName) > (time() - 86400)) {n		$cacheHandle = fopen($cacheName, 'r');n		$newData = fread($cacheHandle, filesize($cacheName));n		fclose($cacheHandle);n		$isCached = TRUE;n	} else {

Здесь мы проверяем, сохранен ли файл кэша, и если файл кэша был создан в течение 24 часов. Если оба этих условия выполнены, то мы открываем файл и извлекаем его содержимое для замены вывода скриптов. Мы также устанавливаем значение $ isCached в true, чтобы мы могли выводить некоторые сообщения в конце.

		//Lets cache!n		$cacheHandle = fopen($cacheName, 'w+');n		fwrite($cacheHandle, $newData);n		fclose($cacheHandle);n		$isCache = FALSE;n	}

Теперь мы кэшируем вывод скрипта для использования в последующих запросах. Мы просто открываем файл в режиме записи, выгружаем наши данные и закрываем его. Строго вам не нужно закрывать файлы на PHP, но это считается хорошей практикой, поэтому я сделал это здесь.

	//Time to output the data.n	if ($ext == 'css') {n		header("Content-type: text/css");n		if ($isCached) {n			echo "// Retrieved from cache file. n";n		}n	} else {n		if ($isCached) {n			echo '';n		}n	}

Это еще одна часть скрипта, который был немного изменен, поэтому мы можем предложить вам обратную связь через браузер. Если файл был извлечен из кеша, мы можем добавить сообщение на вывод скрипта. Обратите внимание, что сообщение для скриптов CSS имеет «n» в конце. Это связано с тем, что символы «комментируют всю нашу строку» и «n» отбрасывают все остальное на другую строку. Если вы хотите отключить сообщения, все, что вам нужно сделать, это прокомментировать строку '$ isCached = TRUE;'.

Предоставление вихря

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

Заключение

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

Подведение итогов

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

Получить нас в Твиттере или подписаться на RSS-канал NETTUTS для более ежедневных веб-разработок и статей.