Привет, меня зовут Илья Чекальский и это мой канал о современном PHP и о всяком, чем обычно приходится заниматься разработчикам, девопсам и техническим директорам.
Я работаю CTO в Комитете — мы управляем сайтами vc.ru, tjournal.ru, dtf.ru и spark.ru. Первые три из них работают на Основе — нашей модульной платформе для медиа.
Этот канал существует и в английской версии: @phpcto
По всем вопросам пишите — @ilya0
Остальные контакты: https://chekalskiy.ru/
Я работаю CTO в Комитете — мы управляем сайтами vc.ru, tjournal.ru, dtf.ru и spark.ru. Первые три из них работают на Основе — нашей модульной платформе для медиа.
Этот канал существует и в английской версии: @phpcto
По всем вопросам пишите — @ilya0
Остальные контакты: https://chekalskiy.ru/
Для логгирования ошибок мы используем Monolog — PSR-3 уже давно стандарт для всех библиотек (кроме фейсбука конечно же). Логи кладутся в ротируемый локальный файл а также уходят на сервер. Сначала мы использовали Rollbar, но они изменили ценовую политику и мы ушли в Sentry, о чём совсем не жалеем. Сейчас мы тратим на него около $30 в месяц.
Sentry позвоялет логгировать как ошибки на бэкенде, так и на фронте. По каждой записи мы имеем полную карточку — где, когда, при каких условиях возникла ошибка, сразу же видим полный трейс. Обычно это позволяет сразу понять, что случилось. Похожие ошибки группируются. С помощью гибкой системы уведомлений настроили отправку ошибок в наш Slack.
https://sentry.io/
#debug #logging #psr3
Sentry позвоялет логгировать как ошибки на бэкенде, так и на фронте. По каждой записи мы имеем полную карточку — где, когда, при каких условиях возникла ошибка, сразу же видим полный трейс. Обычно это позволяет сразу понять, что случилось. Похожие ошибки группируются. С помощью гибкой системы уведомлений настроили отправку ошибок в наш Slack.
https://sentry.io/
#debug #logging #psr3
Мы используем GitHub Flow. Так как у нас один репозиторий на три проекта, ветка master всегда должна содержать протестированный и рабочий код для всех трёх сайтов. Конечно, мы сталкивались с ситуациями, когда исправляли что-то на одном проекте, параллельно ломая что-то на остальных, но после этого мы ввели обязательное тестирование на всех стейджах перед выкаткой в продакшен.
Под каждый таск из Jira мы создаём ветку, и когда задача готова, создаётся Pull Request и ссылка на него кидается в чат в Slack с упоминанием ответственных или целиком команды. Кто-то должен сделать code review. Мелкие фиксы допускается делать в одной ветке на несколько тасков. В это же время ветка мерджится в ветку stage, которая автоматически разливается на все стейдж-серверы. После этого можно приступать к тестированию. Когда всё готово, Pull Request мерджится в мастер.
Раньше после попадания кода в master он сразу улетал на production-серверы, но из-за необходимости полностью сбрасывать memcached при каждом деплое (потому что всё очень сильно закешировано), мы перешли на ручной деплой. В Slack настроили интеграцию и по специальной команде несколько раз в день код улетает на серверы.
#deployment
Под каждый таск из Jira мы создаём ветку, и когда задача готова, создаётся Pull Request и ссылка на него кидается в чат в Slack с упоминанием ответственных или целиком команды. Кто-то должен сделать code review. Мелкие фиксы допускается делать в одной ветке на несколько тасков. В это же время ветка мерджится в ветку stage, которая автоматически разливается на все стейдж-серверы. После этого можно приступать к тестированию. Когда всё готово, Pull Request мерджится в мастер.
Раньше после попадания кода в master он сразу улетал на production-серверы, но из-за необходимости полностью сбрасывать memcached при каждом деплое (потому что всё очень сильно закешировано), мы перешли на ручной деплой. В Slack настроили интеграцию и по специальной команде несколько раз в день код улетает на серверы.
#deployment
Не вижу своей жизни без PHP CodeStyle Fixer и вот почему.
https://github.com/FriendsOfPHP/PHP-CS-Fixer
Эта штука автоматически делает код совместимым с PSR-1 и PSR-2, чистить его от лишних пробелов, array() вместо [] и вообще позволяет коду, написанному разными разработчиками выглядеть примерно одинаково. Это упрощает его последующее чтение и уменьшает баттхёрт технического директора на тему лишних пробелов перед if'ами.
Для этого инструмента есть плагины под все распространённые IDE, так что код можно приводить в порядок сразу после написания по хоткею или даже при каждом сохранении.
Вот наш конфиг, который мы используем сейчас, можете взять его за основу, но не забудьте посмотреть, что значит каждый параметр в документации.
https://gist.github.com/chekalskiy/c79c77657a18419125c72c86fe333b86
#library #php #psr2
https://github.com/FriendsOfPHP/PHP-CS-Fixer
Эта штука автоматически делает код совместимым с PSR-1 и PSR-2, чистить его от лишних пробелов, array() вместо [] и вообще позволяет коду, написанному разными разработчиками выглядеть примерно одинаково. Это упрощает его последующее чтение и уменьшает баттхёрт технического директора на тему лишних пробелов перед if'ами.
Для этого инструмента есть плагины под все распространённые IDE, так что код можно приводить в порядок сразу после написания по хоткею или даже при каждом сохранении.
Вот наш конфиг, который мы используем сейчас, можете взять его за основу, но не забудьте посмотреть, что значит каждый параметр в документации.
https://gist.github.com/chekalskiy/c79c77657a18419125c72c86fe333b86
#library #php #psr2
Не все знают, что для Composer существует куча плагинов, которые добавляют всякие приятные мелочи. Например:
• Versions Check — показывает, какие из пакетов не обновлены до последней версии.
• Changelogs — показывает ссылки на changelog обновлённых пакетов.
• Prestissimo — параллельная загрузка пакетов.
Эти и ещё много других плагинов можно найти в Awesome Composer.
#composer #library
• Versions Check — показывает, какие из пакетов не обновлены до последней версии.
• Changelogs — показывает ссылки на changelog обновлённых пакетов.
• Prestissimo — параллельная загрузка пакетов.
Эти и ещё много других плагинов можно найти в Awesome Composer.
#composer #library
GitHub открыл собственный магазин интеграций.
https://github.com/marketplace
Например, можете в пару кликов подключить Travis CI, Codecov, Dependabot, Sentry, Blackfire зачастую по специальным тарифам. При этом оплачивается это всё через ваш (или корпоративный) аккаунт на GitHub. Для меня он прежде всего полезен тем, что можно в одно месте посмотреть список всех модных SaaS-сервисов. Кстати, есть ещё одно место с модными сервисами — маркетплейс Slack.
#saas
https://github.com/marketplace
Например, можете в пару кликов подключить Travis CI, Codecov, Dependabot, Sentry, Blackfire зачастую по специальным тарифам. При этом оплачивается это всё через ваш (или корпоративный) аккаунт на GitHub. Для меня он прежде всего полезен тем, что можно в одно месте посмотреть список всех модных SaaS-сервисов. Кстати, есть ещё одно место с модными сервисами — маркетплейс Slack.
#saas
И снова про Composer. Если вы, как и я, любите, чтобы все пакеты в composer.json были отсортированы по алфавиту, и делаете это каждый раз вручную, то у меня для вас хорошая новость: в раздел
Также если вы предпочитаете грузить пакеты в виде дистрибутивов, то туда же можно добавить соответствующий параметр. Больше настроек — в документации.
#composer
config в этом файле можно добавить параметр "sort-packages": true — тогда composer require будет автоматически сортировать названия по алфавиту.Также если вы предпочитаете грузить пакеты в виде дистрибутивов, то туда же можно добавить соответствующий параметр. Больше настроек — в документации.
#composer
Если вы содержите документацию к своему API в строжайшем порядке (ха-ха), например, в формате API Blueprint или Swagger, то вам может быть полезен Dredd — инструмент для проверки ответов API. Он проверяет не только коды ответов, но и содержимое JSON-полей на предмет соответствия типу, описанному в документации. Конечно же его можно интегрировать в ваш любимый CI-сервис — тогда больше ни один пул-реквест не сломает ваши приложения.
Ну а если документация к API есть пока только у вас в голове, то это хороший повод её формализовать. Кстати, если предпочитаете SaaS-решения, то аналогичным образом работает Runscope, его ценник начинается от $79 в месяц.
На самом деле оба этих решения лучше всего иметь параллельно — API на продакшене может отличаться от эталонного не только потому что мы залили плохой код, но и, например, из-за того, что в результате сложной последовательности действий нарушилась консистентность базы (удалили пользователя, а его комментарии не удалились из-за ошибки).
#saas #testing #api
Ну а если документация к API есть пока только у вас в голове, то это хороший повод её формализовать. Кстати, если предпочитаете SaaS-решения, то аналогичным образом работает Runscope, его ценник начинается от $79 в месяц.
На самом деле оба этих решения лучше всего иметь параллельно — API на продакшене может отличаться от эталонного не только потому что мы залили плохой код, но и, например, из-за того, что в результате сложной последовательности действий нарушилась консистентность базы (удалили пользователя, а его комментарии не удалились из-за ошибки).
#saas #testing #api
Brotli — новый алгоритм сжатия данных для web от Google. Он существует уже несколько лет и не так давно вышла первая стабильная версия. Что вам надо знать об алгоритме, который, возможно, когда-нибудь придёт на смену gzip?
• Он эффективнее gzip примерно на 20% как по скорости сжатия, так и по коэффициенту компрессии.
• Существуют библиотеки для всех основных веб-серверов. Вот, например, для nginx.
• С сентября Brotli поддерживают браузеры, общая доля которых составляет 70% рынка — в том числе новый Safari.
• Cloudflare рекомендует использовать gzip для маленьких файлов, а brotli — для тех, что побольше (но статья довольно старая).
#devops #nginx
• Он эффективнее gzip примерно на 20% как по скорости сжатия, так и по коэффициенту компрессии.
• Существуют библиотеки для всех основных веб-серверов. Вот, например, для nginx.
• С сентября Brotli поддерживают браузеры, общая доля которых составляет 70% рынка — в том числе новый Safari.
• Cloudflare рекомендует использовать gzip для маленьких файлов, а brotli — для тех, что побольше (но статья довольно старая).
#devops #nginx
Продолжает развиваться новый формат JSON5.
Это такое обратно-совместимое расширение для привычного JSON, делающее его в том числе более удобным для написания руками:
• можно оставлять комментарии,
• можно использовать одинарные кавычки,
• можно не оборачивать в кавычки ключи (но не все),
• можно использовать trailing comma,
и другое.
Библиотека для PHP
#php #library
Это такое обратно-совместимое расширение для привычного JSON, делающее его в том числе более удобным для написания руками:
• можно оставлять комментарии,
• можно использовать одинарные кавычки,
• можно не оборачивать в кавычки ключи (но не все),
• можно использовать trailing comma,
и другое.
Библиотека для PHP
#php #library
Я хочу признаться, что много лет совершал огромную ошибку, которая каждый день влияла на мой код. Последние годы я использовал в качестве IDE сначала Sublime Text, а потом перешёл на Atom — оба они прекрасные редакторы с огромным количеством крутых плагинов и я был ими очень доволен, настроив точно так, как мне хочется. Но потом я запустил PhpStorm.
Я никогда им не пользовался, но недавно вышла новая версия, и меня заинтересовало описание новых возможностей — в частности отслеживание необрабатываемых исключений (Unhandled exception). PhpStorm следит за тем, какие исключения выбрасывают вызываемые функции, и считает, что мы должны или поймать (catch) их, или задекларировать в PhpDoc нашей функции, чтобы не забыть поймать её на уровне выше.
Мы очень широко используем механизм исключений, и мне всегда было очень сложно следить за тем, какие исключения могут быть выброшены в каждый конкретный момент времени, поэтому я решил попробовать PhpStorm, тем более, что есть бесплатный пробный месяц (а потом он будет стоить 9 евро ежемесячно или 90 за год).
Прошло несколько дней, из которых один вечер я потратил на настройку всего-всего, что можно настроить (в том числе конечно же php-cs-fixer) и потом ещё один день, чтобы переписать некоторые части нашего фреймворка, чтобы везде заработало автодополнение и все функции вроде автоматического рефакторинга. Теперь я, наверное, никогда не променяю PhpStorm на что-то другое — идеально работающее автодополнение, очень быстрое всё (по сравнению с Atom), куча катастрофически приятных функций, безошибочный переход к функции и многое и многое другое. Такое ощущение, что с Лады пересел на Тойоту.
Последней вишенкой оказался XDebug, который я игнорировал многие годы и теперь посыпаю голову пеплом. Не будьте как я, используйте полнофункциональные IDE и будет вам счастье.
#php #ide
Я никогда им не пользовался, но недавно вышла новая версия, и меня заинтересовало описание новых возможностей — в частности отслеживание необрабатываемых исключений (Unhandled exception). PhpStorm следит за тем, какие исключения выбрасывают вызываемые функции, и считает, что мы должны или поймать (catch) их, или задекларировать в PhpDoc нашей функции, чтобы не забыть поймать её на уровне выше.
Мы очень широко используем механизм исключений, и мне всегда было очень сложно следить за тем, какие исключения могут быть выброшены в каждый конкретный момент времени, поэтому я решил попробовать PhpStorm, тем более, что есть бесплатный пробный месяц (а потом он будет стоить 9 евро ежемесячно или 90 за год).
Прошло несколько дней, из которых один вечер я потратил на настройку всего-всего, что можно настроить (в том числе конечно же php-cs-fixer) и потом ещё один день, чтобы переписать некоторые части нашего фреймворка, чтобы везде заработало автодополнение и все функции вроде автоматического рефакторинга. Теперь я, наверное, никогда не променяю PhpStorm на что-то другое — идеально работающее автодополнение, очень быстрое всё (по сравнению с Atom), куча катастрофически приятных функций, безошибочный переход к функции и многое и многое другое. Такое ощущение, что с Лады пересел на Тойоту.
Последней вишенкой оказался XDebug, который я игнорировал многие годы и теперь посыпаю голову пеплом. Не будьте как я, используйте полнофункциональные IDE и будет вам счастье.
#php #ide
Если вы пользуетесь macOS и как раз обновились до 10.13.2, то у вас могли перестать работать некоторые приложения и функции, связанные со связкой ключей — например, GitHub Desktop и VPN.
Чтобы пофиксить откройте приложение Keychain Access, правой кнопкой нажмите на связку login и попробуйте залочить и разлочить её. После этого всё заработает.
Чтобы пофиксить откройте приложение Keychain Access, правой кнопкой нажмите на связку login и попробуйте залочить и разлочить её. После этого всё заработает.
Я, наверное, должен был начать вести канал с этой ссылки — это очень важная отправная точка для всех, кто занимается разработкой на PHP на любом уровне — для начинающих это хорошее подспорье, чтобы сразу учиться делать вещи правильно (и сэкономить пару лет, без шуток), для профессионалов — взглянуть на привычные техники под новым углом.
http://www.phptherightway.com/
http://www.phptherightway.com/
Интересный баг поймали — если nginx отдаёт код ошибки
Потестить можно тут: https://dtf.ru/test-524
В конфиге там так:
#nginx
524 A Timeout Occurred с пустым телом, то Safari скачивает пустой файл с расширением dms вместо того, чтобы показать пустую страницу или системную ошибку.Потестить можно тут: https://dtf.ru/test-524
В конфиге там так:
location /test-524 {
return 524;
}#nginx