PHPmail(), msmtp и Яндекс.Почта для домена

Переносил к себе на сервер один сайт и наткнулся на такую задачку, как отправка писем. Письма в движке этого сайта отправляются обычной функцией mail, а желания (да, в общем-то, и потребности) переписывать хоть одну строчку кода не было. Для отправки сообщений я давно уже использую сервис Яндекс.Почта для домена. Есть, конечно, куча других вариантов, но и этот отлично работает. Можно отправлять почту и своими силами, но имеется большая вероятность попасть в папку "спам" у получателей, необходимо настраивать разные штуки, вроде SPF и DKIM. В общем, было принято решение подружить mail и Яндекс.Почту

Для отправки задействуем транспорт SMTP, а отправлять будем простым клиентом msmtp. Устанавливается он двумя движениями пальцев, даже писать неохота, но напишу (для Debian или Ubuntu).

1
sudo apt-get install msmtp

ЛитератураРегулярные выражения. Основы

Купил её довольно давно, всё не доходили руки. И вот дошли наконец. Книга рассчитана на начальный уровень, сама по себе тонюсенькая (всего 143 страницы) и осиливается за пару вечеров. Привязки к определённым языкам программирования или приложениям тоже нет, что неудивительно, ведь книга именно про регулярные выражения.

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

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

NewsНовая админка

Спустя кучу лет привёл до работоспособного состояния и запустил третью версию движка этого бложика. Вернее, это только его часть, админка. Предыдущая торжественная заливка была почти 4 года назад :) Собственно, эту запись из неё первую и пишу.

Технически залитая часть сайта представляет из себя SPA (single page application) на Ember.js и REST API на PHP фреймворке Symfony2. Исходники доступны на гитхабе, так что можете изучать и ломать это приложение полностью.

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

git prompt

GitТекущая ветка в командной строке

Объяснял и показывал сабж уже четырём человекам, по меньшей мере, поэтому сделаю запись и буду скидывать ссылку. Хотя таких записей в интернете уже пруд пруди на всех языках :)

PHP + PAM

PHPАутентификация через системных пользователей линукс

Предположим, что возникла потребность аутентифицировать пользователей PHP-приложения посредством уже существующих в системе пользователей. Тогда для решения этой задачи можно заюзать PAM (Pluggable Authentication Modules). Если в двух словах, то через эту систему производятся манипуляции с пользователями и их паролями такими программами, как login, passwd или su. Если нужно больше информации, тогда вам сюда, например.

Описываемые ниже действия происходят в Ubuntu 14.04. В той же убунте 12.04 имелся готовый пакет php5-pam-auth, но позже его не стало.

Ставить расширение будем из PECL, вот оно. Предварительно доустановим пару пакетов, если они ещё не установлены. Приступим:

1
2
sudo apt-get install php5-dev libpam0g-dev
sudo pecl install PAM

Без php5-dev будет ругаться, что нету phpize, а без libpam0g-dev будет появляться гадостная ошибка install the the PAM library or use --with-pam=DIR to specify the location.

После успешной компиляции добавляем пару строк в php.ini

1
2
extension=pam.so
pam.servicename="php"

И добавляем соответствующий сервис для PAM

1
2
3
4
sudo su

cd /etc/pam.d
ln -s login php

Готово :)

P.S. Возможен ещё такой момент. При работе, например, через Apache или другой веб-сервер, функция pam_auth будет возвращать ложный результат независимо от правильности логина/пароля. Связано это с тем, что пользователь, от которого работает веб-сервер, не имеет доступ к файлу /etc/shadow. Возможно, что можно каким-то образом донастроить сервис php для PAM, с этим я разбираться не стал, а применил более простое решение - добавил пользователя апача в группу shadow, хоть и понимаю, что почти наверняка этим действием проделал ещё одну дыру в безопасности :)

1
sudo usermod -aG shadow www-data

UbuntuNode.js версии 0.12 и убунта

Как-то раньше я уже описывал установку последней версии Node.js на Ubuntu, но приключилась печалька. Беда, собственно, заключается в том, что в описанном репозитории последняя версия ноды 0.10.37, а проект требует минимум 0.12.

Но выход есть всегда :) Node.js уже установлен, нужные переменные окружения прописаны, поэтому чтобы исключить возню с поисками других репзиториев, просто скачаем одну папочку и поправим пару симлинков:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
wget http://nodejs.org/dist/v0.12.7/node-v0.12.7-linux-x64.tar.gz
tar xvzf node-v0.12.7-linux-x64.tar.gz

sudo su
cd /usr/bin

mv npm npm_old
mv nodejs nodejs_old
ln -s /path/to/node-v0.12.7-linux-x64/bin/node nodejs
ln -s /path/to/node-v0.12.7-linux-x64/lib/node_modules/npm/bin/npm-cli.js npm

На этом пока всё.

MySQLПакетное обновление или batch update

Иногда возникает потребность обновить много записей в базе данных, например 3000, 7000 или 25000 штук. Видел даже веб-формы с таким количеством полей, хоть это и полное безумие :) Можно, конечно, обновить эти записи поштучно, но бомбардировать сервер базы данных запросами - плохая идея. Желательно сделать это за раз. И сделать это возможно следующим образом:

1
2
3
INSERT INTO table (`id`, `x`, `y`) VALUES
  (1, 2, 3), (4, 5, 6), (7, 8, 9)
  ON DUPLICATE KEY UPDATE `x` = VALUES(`x`), `y` = VALUES(`y`);

P.S.: Однако, как подсказывают в комментариях, есть нюанс. В случае этого самого ON DUPLICATE KEY UPDATE автоинкрементное поле для таблиц InnoDB всё равно увеличится, будто была вставка в таблицу.

Laravelajax-запросы и VerifyCsrfToken

Если в бекенде сайта используется фреймворк Laravel и просто так взять и отправить ajax-ом POST-запрос, то ничего не выйдет. Вернее, выйдет, но ошибка наподобие такой:

1
TokenMismatchException in VerifyCsrfToken.php line 46:

Исправить такое очень просто, нужно передать недостающий токен. Чтобы не возиться с токеном в каждом запросе, просто настроим его глобально. Добавим в основной шаблон мета-тег с токеном.

1
2
3
4
5
6
7
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <meta name="viewport" content="width=device-width, initial-scale=1">

И установим токен в заголовки по умолчанию.

1
2
3
4
5
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

LaravelКастомные валидаторы в Laravel

Ниже будет описано создание кастомного валидатора, или, если говорить чуть более по-русски, создание пользовательских правил валидации, c фреймворком Laravel 5. Конечно же всё это описано в документации, но мне этого не полностью хватило. С самим ларавелем я работаю всего неделю, так что не исключено, что записи будут ещё. А вот с основным моим в работе фреймворком, Symfony2, в блоге напряжнее, так как почти всё кажется очевидным и писать не о чем :)

laravel requires ext-mcrypt

PHPактивация PHP-расширений

Поднимая проект на Laravel столкнулся с неожиданной проблемой. А именно, с невозможностью установки вендорских библиотек композером. Неожиданность тут в том, что расширение php5-mcrypt было у меня установлено. Однако composer не обманешь.

Небольшое исследование показало, что необходимое расширение хоть и присутствует, но не подключено. Если же расширение не установлено, то делается это так (в Ubuntu и Debian):

1
sudo apt-get install php5-mcrypt

Но вернёмся к активации установленных расширений...