#php

function cartesian(array $set): array
{
    $result = [];

    if (!$set) {
        $result[] = [];

        return $result;
    }

    $head = array_shift($set);

    $tails = cartesian($set);

    foreach ($head as $headValue) {
        foreach ($tails as $tail) {
            array_unshift($tail, $headValue);

            $result[] = $tail;
        }
    }

    return $result;
}

$set = [
    [1, 2],
    ['A', 'B'],
    ['+', '-'],
];

print_r(cartesian($set));

/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => A
            [2] => +
        )

    [1] => Array
        (
            [0] => 1
            [1] => A
            [2] => -
        )

    [2] => Array
        (
            [0] => 1
            [1] => B
            [2] => +
        )

    [3] => Array
        (
            [0] => 1
            [1] => B
            [2] => -
        )

    [4] => Array
        (

Если функция exec возвращает ошибку при выполнении консольной команды, которая успешно работает в cmd.exe, то нужно проверить переменную окружения PATH, которая используется в php. И если в PATH нет пути к необходимой команде, то нужно добавить его.

Например, если не работает команда git, и в getenv('PATH') нет пути к ней, то нужно добавить путь в PATH:

Прямо в скрипте:

$envPath = getenv('PATH');
$envPath .= ';c:\Program Files\Git\bin';
putenv('PATH=' . $envPath);

Либо в файле php.ini в директиве include_path.

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

function showArrayKeysStructure(array $array, $level = 0)
{
    echo '<pre>';

    foreach ($array as $key => $value) {
        echo str_repeat("\t", $level) . var_export($key, true) . PHP_EOL;

        if (is_array($value)) {
            showArrayKeysStructure($value, $level + 1);
        }
    }

    echo '</pre>';
}
function arrayToCsv(array $data): string
{
    $fh = fopen('php://temp', 'rw');

    fputcsv($fh, array_keys(current($data)), ';');

    foreach ($data as $row) {
        $row = array_map(
            function ($value) {
                return mb_convert_encoding($value, 'windows-1251', 'utf-8');
            },
            $row
        );

        fputcsv($fh, $row, ';');
    }

    rewind($fh);

    $csv = stream_get_contents($fh);

    fclose($fh);

    return $csv;
}

Формат подходит для excel.

Как создать ключ с помощью php?

// генерируем ключ
$keyResource = openssl_pkey_new([
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

echo gettype($keyResource) . PHP_EOL; // resource

// получаем приватный ключ
openssl_pkey_export(
    $keyResource,
    $privateKey
);

echo $privateKey;
// -----BEGIN PRIVATE KEY-----
// MIIEvgIBADANBgkqhkiG9w0BAQEF...
// ...
// -----END PRIVATE KEY-----

// сохраняем приватный ключ в файл
file_put_contents(
    'php-private-key.pem', 
    $privateKey
);

// получаем публичный ключ
$publicKey = openssl_pkey_get_details($keyResource);

echo $publicKey['key'];
// -----BEGIN PUBLIC KEY-----
// MIIBIjANBgkqhkiG9w0BAQEFAAO...
// ...
// -----END PUBLIC KEY-----

// сохраняем публичный ключ в файл
file_put_contents(
    'php-public-key.pem',
    $publicKey['key']
);
composer require vendor/package

Скачивает и устанавливает пакет, добавляет записи в файлы composer.json и composer.lock.


composer install

Если файла composer.lock ещё нет, то install создаст на основе composer.json новый composer.lock, и дальше скачает и установит зависимости (а так же удалит лишние, если такие есть) по данным из свежего composer.lock.

Если файл composer.lock уже есть, то install скачает и установит зависимости (а так же удалит лишние) по данным из composer.lock, а файл composer.json будет проигнорирован.


composer update

Обновит версии пакетов и обновит файл composer.lock.

Допустим у нас есть данные:

$data = 'My secret data!';

И мы хотим зашифровать их, чтобы позже расшифровать с использованием пароля, например такого:

$password = '1234';

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

$key = sha1($password);

Рекомендуется использовать для шифрования библиотеку OpenSSL: openssl_encrypt(), openssl_decrypt() и вспомогательные функции.

Для начала нужно выбрать метод шифрования, например, aes-128-cbc. Все доступные методы можно посмотреть вызвав функцию openssl_get_cipher_methods().

$method = 'aes-128-cbc';

Теперь нам нужно создать вектор инициализации (IV, Initialization Vector) - случайные данные, на основе которых будет произведено шифрование.

RabbitMQ

Как установить RabbitMQ?

Для windows очень просто - скачать с официального сайта инсталлятор и установить. :)

Плюс нужно прописать в PATH путь к консольным скриптам (c:\Program Files\RabbitMQ Server\rabbitmq_server-{VERSION}\sbin\).

И добавить в .bashrc: alias rabbitmqctl='rabbitmqctl.bat', чтобы удобнее было запускать консольные команды.

Для установки на Linux и macOS инструкции есть на официальном сайте.

Как проверить запущен ли сервис?

Выполнить в консоли:

rabbitmqctl status

Как посмотреть список сообщений и количество сообщений в них?

Выполнить в консоли:

rabbitmqctl list_queues

Как добавить сообщение в очередь из php?

Устанавливаем библиотеку php-amqplib:

composer install php-amqplib/php-amqplib

Создаём объект соединения:

Страницы