Вопросы производительности PHP?

Я создаю PHP сайт, но пока единственный PHP который я использую, составляет полдюжины или около того на определенных страницах. (Вероятно, я, вероятно, буду использовать некоторые запросы к базе данных).

Являются ли простые include() заявлениями о скорости или масштабировании, в отличие от статического HTML ? Какие вещи, как правило, заставляют сайт бояться?

Solutions Collecting From Web of "Вопросы производительности PHP?"

Строго говоря, прямой HTML всегда будет работать быстрее, чем серверный подход, поскольку сервер не должен делать никакой интерпретации кода.

Чтобы ответить на больший вопрос, есть ряд вещей, которые заставят ваш сайт бояться; просто нет определенного порога, когда ваш код вызывает проблему против PHP. (имейте в виду, что многие сайты Yahoo ориентированы на PHP, поэтому не думайте, что PHP не может масштабироваться).

Одна вещь, которую я заметил, это то, что наиболее ориентированные на PHP сайты – это те, которые содержат больше, чем необходимо для отображения определенной страницы. OSCommerce (oscommerce.com) является одной из самых популярных корзин для покупок с помощью PHP. Однако у него есть плохая привычка включать все свои основные функции (на всякий случай, если это необходимо) на каждую страницу. Поэтому, даже если вам не нужно отображать «информационное окно», функция загружается. С другой стороны, существует много фреймворков PHP (таких как CakePHP, Symfony и CodeIgniter), которые используют подход «загрузить его, когда вам это нужно».

Я бы посоветовал следующее:

  1. Не включайте больше функциональности, чем требуется для конкретной страницы.
  2. Сохранять базовые функции отдельно (при необходимости используйте подход MVC)
  3. Используйте require_once вместо include, если вы считаете, что у вас есть вложенные дополнения (например, страница A включает в себя файл B, который включает в себя файл C). Это позволит избежать включения одного и того же файла более одного раза. Он также остановит процесс, если файл не может быть найден; тем самым помогая вашему процессу устранения неполадок;)
  4. Кэшируйте статические страницы как HTML, если это возможно – избегайте повторной обработки, когда вещи не меняются

Конечно, include () медленнее статических страниц. Однако с современными системами вы вряд ли увидите это как узкое место в течение длительного времени – если когда-либо. Преимущества использования включают в себя, чтобы поддерживать общие части вашего сайта в актуальном состоянии, перевешивают крошечный хит производительности, на мой взгляд (с другой навигацией на одной странице, потому что вы забыли обновить его, что приводит к плохому пользовательскому опыту и, как следствие, к плохим чувствам сайт / компания / все).

Использование кеширования действительно не поможет – кеширующий код будет медленнее, чем просто include (). Единственное временное кэширование принесет пользу вам, если вы делаете вычисления с использованием вычислительных ресурсов (очень редко, на веб-страницах) или захватываете данные из базы данных.

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

Включает в себя факт жизни. Не беспокойтесь о количестве, беспокоитесь о том, что ваш код хорошо организован (структура папок PEAR – это замечательная вещь, если вы не знаете, что я говорю, посмотрите на структуру файлов классов Zend Framework).

Сосредоточьтесь на получении заявки, написанной с разумной суммой абстракции. Группируйте все вызовы БД в класс (или классы), чтобы свести к минимуму дублирование кода (принципы KISS и все), а когда пришло время реорганизовать и оптимизировать ваши запросы, они расположены централизованно. Также приступайте к тестированию отдельных модулей для предотвращения регрессии.

После того, как приложение запущено и работает, не спрашивайте нас, что быстрее или лучше, поскольку зависит от каждого приложения, каким будет ваше узкое место. Может получиться, что, хотя у вас много включений, ваши петли ели ваше время или что-то еще. Используйте XDebug и профайл вашего кода после его запуска и запуска. Ищите сегменты кода, которые потребляют непропорциональное количество времени, а затем рефакторинг. Если вы сейчас слишком много внимания уделяете удару производительности между include и include_once, вы в конечном итоге преследуете призрак, когда эти запросы на завихрение, выполняющиеся в синхронизации, завтракают.

Хотя в то же время лучшие предложения смотрят руководство php.net и проверяют, есть ли встроенная функция, выполняющая то, что вы пытаетесь сделать, используйте ее! Расширения на основе C на PHP всегда будут быстрее, чем любой PHP-код, который вы могли бы написать, и вы будете удивлены, сколько из того, что вы пытаетесь сделать, уже сделано.

Но опять же, я не могу это подчеркнуть, преждевременная оптимизация – ПЛОХО !!! Просто приложите свое приложение к земле с хорошими уровнями абстракции, проанализируйте его, затем исправьте то, что на самом деле съедает ваше время, а не фиксируйте то, что, по вашему мнению, может съесть ваше время.

Nah включает в себя все в порядке, не о чем беспокоиться.

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

Большинство веб-приложений ограничены скоростью их базы данных (или независимо от их внешнего хранилища, но в 9/10 раз это будет база данных), код приложения редко вызывает беспокойство, и это не похоже на то, делаю все, о чем вам нужно беспокоиться.

Прежде чем принимать какие-либо долговременные решения о том, как структурировать код для вашего сайта, я бы рекомендовал вам прочитать некоторые сведения о шаблоне проектирования Model-View-Controller . В то время как есть другие, этот, похоже, набирает много места в кругах веб-разработки и, конечно же, будет на некоторое время. Возможно, вам захочется взглянуть на некоторые другие шаблоны проектирования, предложенные Мартином Фаулером в его шаблонах архитектуры корпоративных приложений, прежде чем принимать окончательные решения о том, какой дизайн лучше всего подходит вашим потребностям.

В зависимости от размера и объема вашего проекта, вы можете захотеть пойти с готовыми фреймворками для PHP, такими как Zend Framework или PHP On Trax, или вы можете решить создать собственное решение.

В частности, для предоставления HTML-контента я настоятельно рекомендую вам использовать какую-то форму шаблонов, чтобы сохранить вашу бизнес-логику отдельно от вашей логики отображения. Я обнаружил, что это одно простое правило в моей разработке сэкономило мне часы работы, когда нужно было изменить один или другой. Я использовал http://www.smarty.net/">Smarty, и я знаю, что большинство фреймворков там либо имеют собственную систему шаблонов, либо предоставляют подключаемую архитектуру, которая позволяет использовать ваши собственные предпочтительные Как вы смотрите на возможные решения, я бы рекомендовал вам искать тот, который способен создавать кешированные версии.

Наконец, если вас беспокоит скорость в фоновом режиме, я настоятельно рекомендую вам взглянуть на способы минимизации ваших вызовов в вашем хранилище данных (будь то база данных или просто системные файлы). Старайтесь не загружать и не предоставлять слишком много контента (скажем, большого отчета, хранящегося в таблице, содержащей сотни записей) сразу. Если возможно, посмотрите, как заставить пользовательский интерфейс загружать меньшие бит данных за раз. И если вас беспокоит фактическое время загрузки вашего содержимого html и его CSS, Javascript или других зависимостей, я бы рекомендовал вам просмотреть эти предложения от ребята в Yahoo !.

Чтобы добавить то, о чем упомянул JayTee, загрузите функциональность, когда вам это нужно. Если вы не используете какие-либо фреймворки, которые делают это автоматически, вам может понадобиться изучить функциональность __autoload (), которая была введена в PHP5 – в основном ваша собственная логика может быть вызвана при создании экземпляра определенного класса, если он еще не создан загружен. Это дает вам возможность включить () файл, определяющий этот класс по требованию.

Самое главное, что вы можете сделать, чтобы ускорить ваше приложение, – использовать кеш Opcode, например APC . В Википедии есть отличный список и описание.

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