производительность и кеширование при смешивании JavaScript с PHP - PullRequest
1 голос
/ 15 ноября 2011

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

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

Например, поскольку я не могу использовать цикл php foreach в файле .js, мне нужно преобразовать массивы php в объекты json, используя json_encode. В других случаях мне нужно объявить переменные gloabl javascript в исходном файле php, чтобы я мог использовать их во внешнем файле js. Поскольку обработка на стороне сервера считается более быстрой, чем в JavaScript, преобразование в массивы js и использование глобальных переменных также может быть плохой идеей ...

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

Ответы [ 6 ]

6 голосов
/ 15 ноября 2011

Вы говорите о производительности сервера или браузера?

Мое личное мнение таково, что, учитывая выбор между замедлением работы сервера или замедлением работы браузера, вы всегда должны разрешать замедление работы браузера..

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

пусть браузер примет удар.

1 голос
/ 15 ноября 2011

Я думаю, это зависит от того, что вы пытаетесь сделать. Мое личное мнение таково, что немного затруднить кэширование вашего динамического JavaScript.

Ваши статические файлы JS должны содержать ваши функции, а не динамические данные. Ваша HTML-страница может содержать ваши динамические данные. Либо внутри блока SCRIPT (где вы сможете использовать PHP foreach), либо путем помещения ваших данных в DOM, где JavaScript может их прочитать, они могут быть видимыми (в таблице) или невидимыми (например, в комментарии) зависит от того, являются ли ваши данные презентабельными или нет.

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

Как говорит Kae, добавление дополнительной нагрузки на клиент принесет пользу вашему серверу с точки зрения масштабируемости (сколько пользователей вы можете обслуживать одновременно).

0 голосов
/ 15 ноября 2011

У меня есть решение, когда ситуация передает информацию от php к js и хранит большинство js вне основного файла php.Используйте объекты js или функции js.Вы делаете некоторый код, который нуждается в данных из php.Когда страница загружается, небольшой ph-код генерируется из php.Как:

<script type="text/javascript">
a(param1, param2, param3)
</script>

и все готово.Сервер указывает param1, param2 и param3 непосредственно в коде.

Функция находится в кэшированном файле .js.При этом вы уменьшаете загрузку сервера и время запуска страницы js.Код клиента немного медленнее, но вы выигрываете время для загрузки, и сервер становится быстрее.

0 голосов
/ 15 ноября 2011

QDF к вашей проблеме - отправить данные в скрытую таблицу HTML.

Таблицы HTML легко генерировать в php и легко готовить в JavaScript.

0 голосов
/ 15 ноября 2011

После долгого чтения

Это то, что вы, вероятно, делаете неправильно.

Есть много людей, которые любят писать статьи (и ответы на Stackovervlow), у которых очень мало опыта и чьи знания основаны ... на других статьях, которые они читают!
Не следуйте их плохому примеру.

Вместо "много чтения" вы должны сделать много профилирования! .

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

Надеюсь, это поможет.

0 голосов
/ 15 ноября 2011

Данные:

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

Все немного сложнее, когда объем данных огромен (от 100 кбайт до мегабайт).Если данные в значительной степени постоянны и кешируются, вы должны сгенерировать внешний файл данных (не фактический новый файл, а уникальный URL-адрес), который затем можно включить.Использование временной метки в имени или правильно установленных заголовков кэша позволит вам сэкономить время как на стороне сервера (генерирование вывода, ориентированного на JS), так и на стороне клиента (загрузка данных), и при этом предлагать обновленные данные.

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

Код:

Функциональная часть вашего кода должнаследуйте объяснениям ранее: Теперь вопрос к тому, должен ли JS быть встроен в HTML или разделен.Это сильно зависит от кода, в основном от его длины и возможности повторного использования.Если это всего лишь 20 строк JS, 10 из которых являются массивами и т. Д., Сгенерированных PHP, было бы более целесообразно оставить код внутри HTML, потому что HTTP-запросы (способ доставки всех ресурсов клиенту)дорого и запрос небольшого файла не обязательно хорошая идея.

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

И нет никакой разницы в производительности PHP или JS, независимо от того, используете ли вы JS внутри шаблонов / PHP или отдельно.Это просто вопрос управления проектом.Что бы вы ни делали, вы должны серьезно изучить использование шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...