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
(
Как удалить из строки метку UTF-8 with BOM
$bom = pack('H*', 'EFBBBF');
$string = preg_replace("/^$bom/", '', $string);
Как провалидировать GUID
if (!preg_match('/^[a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12}$/', $guid)) {
// invalid guid
}
Как настроить работу функции exec в windows
Если функция 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>';
}
Получить csv строку из массива
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
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
Создаём объект соединения: