Как стать автором
Обновить
54.42

PHP *

Скриптовый язык общего назначения

Сначала показывать
Порог рейтинга
Уровень сложности

NoVerify: PHP-линтер, который работает быстро

Время на прочтение14 мин
Количество просмотров16K
Для PHP есть хорошие утилиты статического анализа: PHPStan, Psalm, Phan, Exakat. Линтеры хорошо выполняют свою работу, но очень медленно, потому что почти все написаны на PHP (или Java). Для личного использования или небольшого проекта это нормально, но для сайта с миллионами пользователей — критический фактор. Медленный линтер замедляет CI pipeline и не даёт возможности использовать его в качестве решения, интегрируемого в текстовый редактор или IDE.



Сайт с миллионами пользователей — это ВКонтакте. Разработка и добавление новых функций, тестирование и починка багов, ревью — все это должно проходить быстро, в условиях жестких дедлайнов. Поэтому хороший и быстрый линтер, который сможет проверять кодовую базу на 5 млн строк за 5−10 секунд, незаменимая вещь. 

Подходящих линтеров на рынке нет, поэтому Юрий Насретдинов (youROCK) из ВКонтакте написал свой в помощь командам разработки — NoVerify. Это линтер для PHP, который написан на Go. Он работает в 10-30 раз быстрее аналогов, может находить то, о чем не предупредит PhpStorm, легко расширяется и хорошо интегрируется в проекты, в которых раньше не слышали о статическом анализе. 

Об этом линтере расскажет Искандер Шарипов. Под катом:как выбирали линтер и предпочли написать свой, почему NoVerify такой быстрый и как устроен изнутри, почему написан на Go, что может находить и как расширяется, на какие компромиссы пришлось пойти ради него и что можно построить на его базе.
Всего голосов 37: ↑35 и ↓2+33
Комментарии9

Принцип DRY на примере Laravel

Время на прочтение4 мин
Количество просмотров10K
Рассмотрим простой модуль, отвечающий за добавление новых пользователей.

И на его примере увидим, какие возможности открывает применение принципа DRY.

Для меня принцип DRY (Don't Repeat Yourself) всегда воплощался в двух основных определениях:

  1. Дублирование знаний — всегда нарушение принципа
  2. Дублирование кода — не всегда нарушение принципа

Начнем с контроллеров содержащих минимальное количество логики.
Читать дальше →
Всего голосов 12: ↑11 и ↓1+10
Комментарии22

Митапы PHP-сообществ в марте, которые переходят в онлайн или переносятся

Время на прочтение3 мин
Количество просмотров1.6K


С осени мы ведем список встреч вокруг PHP в разных уголках страны, а Роман pronskiy Пронский публикует ближайшие из них короткой строкой в своем замечательном дайджесте. В этот раз хотим пойти чуть дальше и рассказать чуть больше о каждом сообществе.
Читать дальше →
Всего голосов 17: ↑17 и ↓0+17
Комментарии0

PHP-Дайджест № 175 (25 февраля – 10 марта 2020)

Время на прочтение4 мин
Количество просмотров13K

Свежая подборка со ссылками на новости и материалы. В выпуске: релизы Laravel 7 и CodeIgniter 4, атрибуты v2 и другие RFC-предложения из PHP Internals, порция полезных инструментов, видео, подкасты и многое другое.

Приятного чтения!


Читать дальше →
Всего голосов 42: ↑41 и ↓1+40
Комментарии24

Laravel+Docker+Gitlab. С чего начать

Время на прочтение19 мин
Количество просмотров36K
Я обычно всегда обходился без докера и думал, что докер нужен только для больших проектов в больших компаниях. Но однажды я увидел как работает докер в паре с гитлабом у моего товарища и понял, что мне все таки стоит его изучить. Однако, как обычно это бывает, одной подходящей статьи я не нашел — они были либо слишком сложные, либо не полные, либо подразумевали, что вы все знаете само собой. Мне пришлось долго искать различные источники, соединять все это вместе и в итоге у меня получилось сделать простенький проект и CI/CD для него.

Всю работу можно разделить на три части: на локальной машине, на гитлабе и на сервере.

Итак, для реализации проекта нам понадобится аккаунт gitlab и удаленный сервер с виртуализацией KVM или XEN.

Часть 1. Локальная машина


На локальной машине необходимо установить docker.

Замечание
Тут небольшое отступление. Docker можно поставить как на Linux системах (как Ubuntu, например), так и на Windows и MacOS. По поводу macos я ничего сказать не могу, а вот установка под Windows не самая хорошая идея для начинающего. Как минимум из-за того, что все мануалы и документации написаны для linux систем. Так и из-за того, что можно нажить проблем с доступом к различным папкам и файлам. Также докер конфликтует с виртуальной машиной VirtualBox. Поэтому проще и быстрее будет сделать виртуальную машину с Ubuntu и работать под ней
Всего голосов 16: ↑14 и ↓2+12
Комментарии26

Маппинг данных из реляционной БД

Время на прочтение3 мин
Количество просмотров18K
Иногда возникают ситуации, когда решение задачи выборки данных из реляционной БД не укладывается в возможности используемой в проекте ОРМ, например, либо из-за недостаточной скорости работы самой ОРМ, либо не совсем оптимальных SQL запросов генерируемых ею. В таком случае обычно приходится писать запросы вручную.

Проблема в том, что данные из БД (в т.ч. в ответ на JOIN запрос) возвращаются в виде “плоского” двухмерного массива никак не отражающего сложную “древовидную” структуру данных приложения. Работать с таким массивом дальше крайне неудобно, поэтому требуется более-менее универсальное решение, позволяющее привести этот массив в более подходящий вид по заданному шаблону.

Решение было найдено, удобное и достаточно быстрое.
Читать дальше →
Всего голосов 15: ↑12 и ↓3+9
Комментарии29

История о том, как я разработал язык программирования

Время на прочтение10 мин
Количество просмотров14K

Привет Хабр! Меня зовут Ильдар. Мне 29 лет. Программирую с 2003 года. За свою жизнь создал 4 фреймворка и язык программирования. В этом посте я поделюсь своим опытом, инсайтами, которые я получил при разработке языка программирования BAYRELL Language. Заранее прощу прощения за возможные синтаксические и пунктуационные ошибки в тексте и отсутствие картинок.

Читать дальше →
Всего голосов 31: ↑26 и ↓5+21
Комментарии48

Использование RabbitMQ вместе с MonsterMQ часть 5

Время на прочтение4 мин
Количество просмотров1.3K
В предыдущей части мы улучшили нашу систему логгирования. Вместо использования обменника типа fanout мы использовали обменник типа direct, позволившему нам выборочно принимать сообщения. Не смотря на улучшения, наша система до сих пор имеет ограничения, например мы не можем принимать сообщения основываясь на нескольких критериях. Например в нашей системе мы могли бы хотеть перенаправлять сообщения основываясь не только на уровне строгости сообщения, но и на источнике сообщения. Например как в unix-инструменте syslog, который перенаправляет сообщения не только в зависимости от уровня строгости (info/warn/crit..), но и в зависимости от источника (auth/cron/kern...). Это может дать нам дополнительную гибкость, например мы сможем получать только критические сообщения от 'cron', но также все сообщения от 'kern'. Для реализации такой системы нам предстоит познакомиться с более сложным типом обменника — topic.
Читать дальше →
Всего голосов 6: ↑6 и ↓0+6
Комментарии0

Принцип Единой Ответственности (SRP) на примере Laravel

Время на прочтение4 мин
Количество просмотров9K
Принцип SRP (Принцип Единой Ответственности) — один из основополагающих принципов написания поддерживаемого кода. В этой статье я покажу как применить данный принцип на примере языка PHP и фреймворка Laravel.

Часто, описывая модель разработки MVC, на контроллер возлагаются необоснованно большие задачи. Получение параметров, бизнес логика, авторизация и ответ.

Конечно, в статьях и книгах это описывается в качестве примера, но часто воспринимается как призыв к действию в рабочих проектах. Такой подход неизбежно приведет к неконтролируемому разрастанию класса и сильно усложнит поддержку кода.
Читать дальше →
Всего голосов 15: ↑12 и ↓3+9
Комментарии14

Создаём WEB адресный справочник PHP + LDAP

Время на прочтение7 мин
Количество просмотров16K
Так случилось, что у (относительно) большой кампании было много отдалённых офисов, в которых находилось приличное количество пользователей. Все офисы соединены в одну сеть с общим доменом, каждый офис был определён в Active Directory (далее по тексту AD) как Organization Unit (OU), в котором уже заводились пользователи.

Необходимо было дать пользователям возможность быстро и без особенных усилий получать контактные данные необходимого сотрудника из AD, а системных администраторов освободить от рутины редактирования текстового файла, который играл роль адресной книги.
Если вам интересна данная тема - читайте продолжение дальше
Всего голосов 14: ↑11 и ↓3+8
Комментарии19

PHP: array_key_exists ищет быстрее чем in_array в 500 раз

Время на прочтение3 мин
Количество просмотров14K
В 2014 уже писали про обыск массива, но вряд ли кто понял.

C тех пор вышло много версий PHP и не исправили значит обратная связь плохая и об этом мало кто знает. На питоне так же, и в 3* хуже чем в 2.7.

Иногда нужно найти строку в массиве строк — очень частая операция в разных алгоритмах и если массив небольшой и искать немного и не в цикле, то in_array нормально, на общую скорость не влияет, но если big data и искать надо массиве из миллиарда строк и миллиард раз, то это уже критично: лучше час вместо недели.

Простой тест показывает:

in_array ищет за 6-9 сек ideone.com/Yb1mDa 6600ms
а array_key_exists ищет тоже самое, но быстрее в 250(php5.6/py3.*) в 400+ раз (php7.3/py2.7) ideone.com/gwSmFc (цикл увеличен в 100 раз) 12ms (6600/12=550раз +-10% разброс из-за нагрузки и кеша)

Почему же такое происходит? Рассмотрим подробно:
Читать дальше →
Всего голосов 44: ↑18 и ↓26-8
Комментарии50

Использование RabbitMQ вместе с MonsterMQ часть 4

Время на прочтение4 мин
Количество просмотров1.1K
В предыдущей статье мы написали простую систему логгирования. В которой мы отсылали сообщения сразу нескольким получателям. В этой статье мы добавим в неё новую функцию, которая позволит получателям получать только определённое подмножество сообщений. Благодаря этому мы сможем, например, отправлять только критические сообщения в лог-файл, в то же время выводя все отосланные сообщения в окно терминала.
Читать дальше →
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Установка VestaCP на VPS, использование docker для понижения версии PHP

Время на прочтение7 мин
Количество просмотров7.6K
Доброго времени!

Оставлю тут решение для своего хостинга на VPS за 5 евро, в основном с целью сохранить реализацию решения по своей проблеме.

Несколько лет назад я арендовал выделенный сервер под 20+ сайтов, файлообменник, базу даных на PostgreSQL для 1С, почтовый сервер IMAP. В качестве панели управления использовал ISPmanager с «вечной» лицензией, в качестве ОС был использован изначально CentOS 7 (или даже 6), который я не очень уважаю, больше нравится Debian/Ubuntu. В дальнейшем проекты уходили в соцсети, сайты переставали быть необходимыми, доменные имена освобождались.

В 2019 году я понял, что реально крутится мой сайт и два сайта клиентов, потребность в IMAP с хранением писем на хостинге только у меня, файлообменники так же ушли в облачные сервисы.



Что делать, если один сайт на хостинге не работает с PHP выше 5.4
Читать дальше →
Всего голосов 11: ↑7 и ↓4+3
Комментарии20

Ближайшие события

Как я писал полудецентрализованную криптовалюту на PHP. (Часть 2 — Разработка)

Время на прочтение5 мин
Количество просмотров2.8K

Предисловие


В одной из прошлых статей я рассказывал какие библиотеки нам пригодятся и сравнили эту задумку с той неудачной. В этой части будем разрабатывать саму криптовалюту и настроим трекер. Не будем медлить, поехали.
Читать дальше →
Всего голосов 18: ↑12 и ↓6+6
Комментарии2

Как я писал полудецентрализованную криптовалюту на PHP. (Часть 1 — Сбор библиотек)

Время на прочтение3 мин
Количество просмотров4.7K

Предисловие


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

Что происходило во время двух месяцев радиомолчания
  1. Улетал в другую страну отдохнуть.
  2. Читал во время отдыха комментарии которые пишут.
  3. Ждал выход новой версии одной из библиотек (P2P-библиотеки для PHP, а она полудецентрализованная потому-что Вам будет насколько я понимаю лень открывать порты).
  4. Занимался разработкой материалов к этой статье.
  5. Прибывшим домой, старался всем отвечать.
  6. И конечно же — ничего не делал :).


Надеюсь на то, что хотя бы эту линейку не заброшу.
Читать дальше →
Всего голосов 11: ↑7 и ↓4+3
Комментарии6

Использование RabbitMQ вместе с MonsterMQ часть 3

Время на прочтение4 мин
Количество просмотров1.8K
В нашей предыдущей статье мы создали очередь задач. Она предполагает что одна задача в виде сообщения доставляются одному получателю. В этой статье мы сделаем кое-что другое, мы будем отсылать одно сообщения сразу нескольким получателям. Мы создадим систему логгирования которая будет состоять из двух программ: первая будет отправлять сообщения, а вторая получать и выводить их. В нашей системе, все запущенные получатели будут получать сообщение отосланное отправителем.
Читать дальше →
Всего голосов 7: ↑6 и ↓1+5
Комментарии0

Избавляемся от рутины со своим плагином для PhpStorm

Время на прочтение10 мин
Количество просмотров13K
Привет, Хабр! Я тружусь в команде Антиспама, и, как и у большинства бэкенд-разработчиков Badoo, большая часть времени у меня уходит на работу с PHP-кодом.

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

Так появился плагин Badoo для PhpStorm, который мы сегодня активно используем. За несколько лет его возможности серьёзно расширились, мы его развиваем, и в этой статье я расскажу на примере наших кейсов, как адаптировать IDE под свои задачи и инструменты, и докажу, что это не так сложно, как кажется.


Читать дальше →
Всего голосов 66: ↑66 и ↓0+66
Комментарии12

Использование RabbitMQ вместе с MonsterMQ часть 2

Время на прочтение5 мин
Количество просмотров2.2K
image
(Изображение взято с официального сайта RabbitMQ)

В первой статье мы написали две программы на PHP, которые используют RabbitMQ: одна посылала сообщения, вторая принимала. В этой статье мы разберём как создать очередь, которая будет распределять задачи, затрачивающие значительное количество времени, среди многих воркеров (обработчиков сообщений).
Читать дальше →
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

PHP-Дайджест № 174 (10 – 24 февраля 2020)

Время на прочтение5 мин
Количество просмотров15K

Свежая подборка со ссылками на новости и материалы. В выпуске: 5 новых RFC из PHP Internals, а также предложение по развитию языка и пара прототипов новых фич в виде пул-реквестов, порция полезных инструментов, видео, подкасты и многое другое.

Приятного чтения!


Читать дальше →
Всего голосов 60: ↑59 и ↓1+58
Комментарии39

Представляем PHP 7.4: Производительность, Возможности, Устаревший Функционал

Время на прочтение8 мин
Количество просмотров20K

PHP постоянно развивается, и только что мир увидело их последнее обновление — PHP 7.4. Производительность и скорость продолжают расти, в чём мы убедились ещё в предыдущих релизах PHP 7. Предварительная загрузка — одно из самых ярких обновлений. Эта возможность позволяет значительно ускорить выполнение скрипта и делает код чище и быстрее благодаря уменьшённому количеству строк кода.


PHP является важным элементом всемирной паутины и используется более чем на 79% всех сайтов. Известные сайты, такие как Facebook, Википедия, WordPress и многие другие используют PHP.

Мы можем увидеть что скорость веб-сайтов WordPress увеличивается вдвое, если сравним сайты, работающие на PHP 5 и 7. От последней версии больше всего выиграют сайты на WordPress.

Читать дальше →
Всего голосов 21: ↑12 и ↓9+3
Комментарии22