Как на PHP работать с Telegram Core API (MTProto)

Эта заметка не про Bot API, а про Core API Telegram, с помощью которого можно создавать полноценные клиенты для месседжера, и конечно же любой другой софт, например для сбора данных из Телеграма. Основная проблема заключается в том, что общение с серверами Telegram осуществляется по специальному протоколу разработанным внутри компании — MTProto. Именно благодаря этому протоколу данный месседжер и славится своей безопасностью и шифрование данных.

Если вас мучают вопросы: как использовать Telegram Api на PHP. Как вызывать функции? Очень много примеров использования telegram api для бота, а как использовать обычное api telegram? Зарегистрировал приложение, получил api_id и api_hash, как получить все сообщения из телеграм-канала? https://core.telegram.org/method/messages.getHistory
Как вызвать этот метод? То эта статья для вас!
Читать далее Как на PHP работать с Telegram Core API (MTProto)

Что не так с file_put_contents() в PHP?

Если в кратце, то суть такая: file_put_contents() не атомарен и не гарантирует записи данных файл, а может вообще очистить его содержимое так и не записав новое содержимое.

Синтаксический сахар это хорошо. Судя по описанию, функция file_put_contents() идентична последовательным успешным вызовам функций fopen(), fwrite() и fclose(), что влечёт за собой некоторые особенности, связанные с этими функциями. Сразу скажу, что пробовал воспроизводить это только внутри Docker контейнеров и утилизацией диска близкой к 100%, возможно в другом окружении такое поведение воспроизводиться не будет. Для начала давайте с умным видом  посмотрим исходник PHP 7.1.12. Читать далее Что не так с file_put_contents() в PHP?

Интересные решения с HighLoad Cup

В августе 2017 года Mail.Ru Group провёл чемпионат для backend-разработчиков HighLoad Cup. Суть конкурса проста: используя любой стек технологий написать как можно более производительное приложение под ограниченные серверные ресурсы обрабатывающее заранее определённый набор запросов и упаковать его в docker контейнер. Естественно, в лидерах оказались решения на C/C++, Java, GoLang. Что удивительно, PHP стек оказался производительнее NodeJS и Python решений. Читать далее Интересные решения с HighLoad Cup

Отрицательные стороны админки Voyager для Laravel

Недавно наткнулся на очередную админку для Laravel — Voyager. На данный момент она имеет 4 715 звёзд на гитхабе, что в 2-5 раз выше, чем у других аналогичных проектов. Мне понравилась видео-презентация и я решил посмотреть Voyager в деле. Далее я постараюсь убедить вас не использовать её в продакшене особенно при CI подходе.

Читать далее Отрицательные стороны админки Voyager для Laravel

Что не так с функцией http_build_query в PHP

Казалось бы http_build_query — простая функция, однако, имеет некоторые особенности. Нельзя однозначно сказать что это баг, скорее просто недокументированная фича, которую стоит учитывать при разработке.

Допустим, есть массив [‘page’ => 2, ‘hide’ => null]. Что же вернёт http_build_query в результате? Это будет просто page=2, аргумент hide был отброшен, т.к. он имеет значение null! Что будет, если передать массив, где все значения будут null? Функция вернёт строку нулевой длины. Читать далее Что не так с функцией http_build_query в PHP

Установить Composer как системную команду в Linux

Сейчас мало проектов на PHP обходятся без пакетного менеджера Composer. Однако, он не является предустановленным пакетом в операционных системах даже при наличии установленного php.

При попытке запуска composer install может возникнуть ошибка:

-bash: composer: command not found

Исправить это можно одной строчкой:

curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/bin/composer

Эта последовательность команд установит композер и переместит его в директорию системных команд.

Как сделать ЧПУ (Slug, ModRewrite, Seo Friendly Url) для Laravel

Не все знают, что такое слаги (на английском slug), зачем они нужны, и как их использовать в Laravel. Итак, что такое слаг и зачем он нужен. Как нам подсказывает вики — это семантический URL. Отсюда можно сделать вывод, что это ссылка которая помогает и пользователям и поисковым роботам понять, что находится по этой ссылке. Так же эти штуки известны как ModRewrite, SEF (Seo Friendly Url), ЧПУ (Человеко-Понятный УРЛ). Читать далее Как сделать ЧПУ (Slug, ModRewrite, Seo Friendly Url) для Laravel

Как экспортировать данные их MongoDB в CSV

MongoDB неплохо справляется с задачей хранения огромных коллекций неструктурированных данных. Иначе говоря, если вы не можете описать структуру своих данных и не знаете как она изменится в будущем, но можете эти данные отобразить в json-формате, то mongo справится с задачей хранения schemaless данных.

Однако, большое количество документов в json-формате достаточно трудно отобразить в удобном для человека виде. Для экспорта простых отчётов их монги можно написать небольшой скрипт:

print("id,name,city");

db.collection.find({
 "location.country": "anything"
}, {
 "id": 1,
 "name": 1,
 "location.city": 1
}).forEach(function(item) {
 if(typeof item.location === "undefined") {
   city = "";
 } else {
   city = item.location.city;
 }

 print(item.id + "," + item.name + "," + city );
});

И выполнить его в MongoDB таким способом:

mongo database export.js > out.csv

Поясню по скрипту:

  • в первой строке выводим заголовки столбцов в CSV формате
  • затем фильтруем (find) коллекцию (db.collection) по полю (location.country)
  • перечисляем имена полей («id»: 1) которые нужно извлечь из документов
  • если в документе не определено поле (typeof item.location === «undefined»), задать ему значение по-умолчанию
  • формируем строку со значениями через запятую в CSV формате

Как искусственный интеллект влияет на сознание

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

Как создать новый проект на Laravel 5.6

Заметка для тех, кто хочет программировать с использование PHP фреймворка Laravel, но не знает с чего начать. Для начала нужно инициализировать Laravel с помощью Composer (который должен быть предварительно установлен).

composer create-project --prefer-dist laravel/laravel project

Вместо project можно указать любую другую директорию. На этом можно было бы остановиться, но давайте рассмотрим несколько лайфхаков облегчающих разработку проекта на Laravel. Важно: для версий Laravel отличных от 5.6 выполняемые команды и настройки могут отличаться! Читать далее Как создать новый проект на Laravel 5.6

Шпаргалка по wget: как выкачать сайт целиком

Простой консольной утилитой wget можно решать большое количество задач. Например, выкачать сайт или конкретную директорию со всеми картинками, скриптами и прочими файлами. В этой заметке расскажу о нескольких часто используемых кейсах и наиболее полезных флагах и опциях. Для начала приведу несколько примеров команд: Читать далее Шпаргалка по wget: как выкачать сайт целиком

cURL error 60: SSL certificate : self signed certificate in certificate chain

При работе с curl не только в php может возникнуть подобная проблема:

cURL error 60: SSL certificate : self signed certificate in certificate chain (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

Решить её можно следующим образом:

  1. Скачать последнюю версию файла cacert.pem.
  2. В конфигурационном файле php.ini добавить или отредактировать строку curl.cainfo=/path/to/cacert.pem.
Если доступа к php.ini нет, то можно установить эту опцию программно:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');

Если проблема снова появляется, то можно настроить автоматическое обновление этого файла, например, с помощью команды:

curl --remote-name --time-cond /path/to/cacert.pem https://curl.haxx.se/ca/cacert.pem

Т.к. файл обновляется достаточно всего несколько раз в год, то обновлять его чаще раза в день или неделю не имеет смысла.

cacert.pem содержит набор сертификатов CA (Certification Authority) — доверенных центров сертификации. Этот файл иногда называют «CA cert store».

Хитрости при работе с регулярными выражениями PCRE на PHP

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

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

Разбор задачи про лифты в бизнес-центрах

Ещё одна задачка для собеседования на должность backend-разработчика. Адовость заключается в отсутствии и отказе предоставлять описание алгоритма выбора лифтов и пограничных случаев, а так же в отсутствии дополнительных сведений о работе подобных лифтов.

Есть в бизнес-центрах лифты, когда пассажир нажимает на кнопку нужного этажа, а на экране загорается номер лифта, на который нужно сесть пассажиру. Нужно смоделировать работу X подобных лифтов в Y этажном здании.

Читать далее Разбор задачи про лифты в бизнес-центрах