PHP Profi

КвестКак хакнуть форму

Мы запустили квест по мотивам статьи взлома. Удачного вам прохождения.
Попытались: 259
Прошли: 55
Квест вновь доступен для прохождения !

SymfonyТестируем маршрутизатор Symfony 4.1

Насколько быстрее новый маршрутизатор Symfony в реальных приложениях?

Мы провели несколько тестов, чтобы выяснить это.

Улучшенный маршрутизатор

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

Если вы пропустили эту новость, вы можете почитать официальный анонс.

Если вы хотите знать, как новый маршрутизатор работает, почитайте пост Nicolas Grekas, где он более подробно описывает новые изменения.

Наши реалии

  • Версия PHP: 7.1.13
  • Статические маршруты: 285
  • Динамические маршруты: 350
2018-03-15 alek13

ИнструментыБыстрый Web-парсинг с помощью ReactPHP

logo

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

2018-02-19 alek13

Тонкости языкаАсинхронный PHP: Зачем?

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

2018-02-15 alek13

ТестированиеMockery: частичные двойники (mock'и)

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

Одна из самых больших проблем с этим кодом заключается в том, что это довольно трудно тестировать. Методы из базового класса могут возвращать другие объекты, побочно затрагивают другие части кода (или вызывают сервисы), делают http-запросы...

2018-02-07 alek13

ИнструментыTest Coverage: Интеграция CodeClimate и Travis CI

Когда вы разрабатываете проект с открытым исходным кодом, считается хорошей практикой иметь высокое покрытие тестами, чтобы сообщество могло чувствовать себя в безопасности, используя ваш код в своих проектах. Существуют онлайн-сервисы, которые могут анализировать качество вашего кода и предоставляют отчёты и рекомендации. Одним из самых популярных является Code Climate. Этот сервис не запускает ваши тесты, но вы можете использовать один из инструментов непрерывной интеграции(CI) для их запуска, а затем отправлять его результат в Code Climate. В этой статье будет показано, как использовать Travis CI для запуска тестов и данные о покрытии тестами в CodeClimate.

logo

2018-02-07 alek13

LaravelGroupBy по нескольким значениям в Laravel

В Laravel начиная с версии 5.5.29 можно группировать коллекции по нескольким критериям. Давайте посмотрим, что это означает и как это работает.

Подготовка

Итак, эта статья о новой функциональности в фреймворке Laravel. Но прежде чем мы посмотрим как она работает сейчас, давайте посмотрим как она работала раньше. Метод groupBy является методом класса Collection. Для наших примеров я создам немного данных, с которыми мы будем работать. Students будет фабрикой состояний для передаваемого класса User.

// Default user factory which comes with Laravel
$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

// Our new students state
$factory->state(App\User::class, 'students', function (Faker $faker) {
    return [
        'skilllevel' => collect(['beginner', 'intermediate', 'professional'])->random(),
        'teacher' => collect(['Peter', 'Markus', 'Chris'])->random(),
    ];
});
2018-02-05 alek13

ПакетыSlack. Отправка простого сообщения.

Недавно я писал пост о реинкарнации популярного PHP-пакета для Slack, в котором рассказывалось о форке популярного пакета и возобновлении поддержки оного. Однако, в статье нет ни слова о том как его использовать. Кроме того, на русском языке нет ни слова об использовании этого пакета. Да и об отправке сообщений в Slack в целом практически нет информации. Я решил исправить эту ситуацию и рассказать о том как можно быстро реализовать на PHP простейшую отправку сообщений в Slack.

Отправка Slack-сообщения на PHP

Сначала давайте взглянем в целом на реализацию отправки. Что бы мы могли отправить сообщение из PHP, нам необходимо сделать 3 небольших и простых пункта:

2018-01-24 alek13

НовостиКачество кода: 'взбиваемость' (churn) и сложность (complexity). Как отслеживать легаси.

Cложность кода (code complexity)

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

Сложность кода является показателем для нескольких вещей:

  • Насколько трудно понять кусок кода. Большое значение показателя говорит о многочисленном ветвлении в коде. При чтении кода, программист должен отслеживать все эти ветки, чтобы понять все различные пути, в которые может "зайти" приложение при исполнении.
  • Насколько трудно протестировать этот кусок кода. Большое значение показателя указывает на множество ветвей кода, и для того, чтобы полностью протестировать этот кусок кода, все эти ветви должны быть покрыты отдельно.
2018-01-22 alek13

ТестированиеНе пишите бесполезные unit-тесты

На днях я наткнулся на следующий код в проекте:

class Users
{
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }
 
    public function getAllUsers()
    {
        $stmt = $this->pdo->prepare('SELECT * FROM users');
        return $stmt->fetchAll();
    }
}

 

И был вот такой тест для проверки этого кода:

class UserTest extends TestCase
{
    public function testGetAllUsers()
    {
        $pdo = m::mock(PDO::class);
        $stmt = m::mock(PDOStatement::class);
         
        $pdo->shouldReceive(‘prepare’)->andReturn($stmt);
        $pdoStmt->shouldReceive(‘fetchAll’)->andReturn($userArray);
 
        $users = new Users($pdo);
        $result = $users->getAllUsers();
         
        $this->assertEquals($userArray, $users);
    }
}

Обратите внимание, что я опустил остальную часть класса User, а также массив пользователей, который возвращается в тесте.

Этот тест на самом деле даёт нам 100%-ое покрытие кода в методе getAllUsers(). Но, к сожалению, для любой практической цели, этот тест полностью бесполезен.

2018-01-19 alek13

LaravelИспользование Laravel'овских строк перевода(локализации) во Vue.js

Одина из проблем, с которой вам придется столкнуться при создании мультиязычного сайта — это то, как держать в порядке ваши строки переводов для серверной стороны и для JavaScript компонентов. Я собираюсь продемонстрировать основные приёмы реализации этого, используя в моих примерах Laravel и Vue.js.

2018-01-18 alek13

ПакетыРеинкарнация популярного PHP-пакета для Slack

Всем привет!

Сегодня я хочу рассказать о небольшом, но популярном open source пакете и попросить у вас помощи и поддержки.

Slack

Все вы наверняка использовали Slack в своих командах для упрощения работы над проектом. В этом плане Slack - очень удобная штука.

2018-01-10 alek13

ИнструментыПодключение к Redis через Unix-сокеты в Docker

Подключение к Redis через Unix-сокеты, как правило, быстрее, чем подключение через TCP/IP.

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

Имея 10М+ скачиваний, redis является четвертым среди самых скачиваемых Docker-образов, и большинство систем настраивают подключение к Redis через Docker'овский встроеный сетевой TCP-мост.

Docker'овский собственный сетевой TCP-мост — это, конечно, хорошо и прекрасно, но не хотели бы вы выжать еще немного скорости?

2017-12-28 alek13

НовостиДобро пожаловать!

Всем привет!

Мы поздравляем всех, кто уже прошёл наш квест "Как хакнуть форму". Всем спасибо за ваши отзывы и комментарии по квесту.

Как мы уже говорили, всем, кто прошёл его, мы выслали инвайты. И всем, кто пройдёт квест до его завершения, инвайты будут высланы в 24:00 в день прохождения.

Большинство тех, кто получил инвайты, уже зарегистрировались и мы рады приветствовать новых пользователей.

Дамы и господа, you are welcome!

2017-12-26 alek13

ПакетыАсинхронный параллельный запуск кода в PHP на примере Laravel Collection

Фреймворк Laravel имеет отличный класс для работы с коллекциями, который имеет много полезных операций. Класс также является macroable. Это означает, что к нему можно добавлять функции во время выполнения путем вызова его метода macro и передачи названия и замыкания. В наших проектах мы, как правило, пишем один и тот же макрос снова и снова. Вот почему мы вынесли эти макросы в пакет laravel-collection-macros, так что вы можете их использовать, котоый основан на amphp/parallel.

В этом посте я хотел бы поговорить немного о новом макросе,  называемом parallelMap. parallelmap идентична map`у, но каждый элемент в коллекции будут обрабатываться параллельно.

Давайте взглянем на пример:

2017-12-25 irul

ИнструментыСкажите "Thanks!" библиотекам, которые используете

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

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

2017-12-22 irul

ПакетыПроизводительность AMQP-клиентов на PHP. Benchmark`и всех!

Рост популярности AMQP interop вызвал волну вопросов относительно того, какой адаптер является самым быстрым. В этом посте я хочу поделиться своими выводами о производительности постановки сообщений в очередь. Позже будет подобный пост о "разгребании" очереди.

Рассмотрим:

а также их адаптеры с имплементацией AMQP interop:

и один из мира Golang:

2017-12-22 alek13

ПакетыMockery: разные возвращаемые значения при разных аргументах

Иногда при работе с mock объектами библиотеки Mockery, мы хотим сообщить фейковому методу, чтобы он возвращал разные значения для разных аргументов. Это редкий случай, когда мне нужна эта функциональность, но каждый раз, когда мне это нужно, я счастлив, что она есть.

2017-12-21 alek13

ComposerУправление зависимостями и решение конфликтов в PHP через Composer

Когда вы создаете PHP-приложение или библиотеку, вы, как правило, имеете 3 вида зависимостей:

  • Жесткие зависимости: то, что требуется вашему приложению/библиотеке, чтобы работать
  • Необязательные зависимости: например, ваша PHP-библиотека может предоставлять адаптеры/бриджи для различных фреймворков
  • Зависимости для разработки: инструменты отладки, тестирования...

Как управлять этими зависимостями?

2017-12-20 alek13

НовостиУстановка новой версии PHP 7.2

PHP 7.2

Недавно был релиз PHP 7.2, который привнёс несколько отличных новых фич и улучшений безопасности в язык. Например, таких, как указание типа object, разумное поведение count() и многое другое.

Здесь мы собрали краткие руководства о том, как установить PHP 7.2 на нескольких разных операционных системах:

2017-12-08 alek13

SymfonyНеймспейсы и организация сервисов бизнес-логики в Symfony

Я хочу поговорить о пространствах имен для сервисов в Symfony, специфичное для Symfony3.

Это захватывающие времена, Symfony 4 уже на подходе — выходит 30-го ноября — так что этот пост может стать неактуальным в ближайшее время! Тем не менее концепт всё тот же, так что давайте взглянем на него!

2017-11-29 alek13