Что не так с функцией 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

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

Как экспортировать данные их 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

Как на 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)

Как проверить число на чётность в любом языке программирования?

Есть очень простое и элегантное решение основанное на свойстве двоичных чисел: число нечётное только тогда, когда его младший бит установлен в 1. С помощью битовой операции & (и) можно это проверить.

php > echo -2 & 1;
0

php > echo -1 & 1;
1

php > echo 0 & 1;
0

php > echo 1 & 1;
1

php > echo 2 & 1;
0

php > echo 3 & 1;
1

php > echo 4 & 1;
0

Как поменять местами значения двух переменных в PHP?

Существует красивое и элегантное решение в одну строку:

list($a, $b) = [$b, $a];

Что более читаемо и проще, чем классическое:

$tmp = $a;
$a = $b;
$b = $tmp;

Читать далее Как поменять местами значения двух переменных в PHP?