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

Шпаргалка по 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 этажном здании.

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

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

Есть очень простое и элегантное решение основанное на свойстве двоичных чисел: число нечётное только тогда, когда его младший бит установлен в 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?

Ротация логов docker контейнеров

В продолжение прошлой статьи рассмотрим пример настройки ротации логов контейнеров на примере CentOs 7. В моём случае stdout и stderr контейнеров никакой ценности не имеют, а все значимые события пишутся либо в примонтированные директории, либо в Apache Kafka. В ротации логов внутри самих контейнеров не вижу смысла.

Читать далее Ротация логов docker контейнеров