Показать все контейнеры
docker container ls --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" -a
Показать все контейнеры
docker container ls --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" -a
PHP вывести сколько памяти использовал скрипт
function convert($size) { $unit=array('b','kb','mb','gb','tb','pb'); return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; } echo convert(memory_get_usage(true));
Сделать из буфера ексель список для массива
Рецепт бекапа mysql БД, если она работает в докере:
Создаем скрипт:
#!/bin/bash DATA=`date +"%Y-%m-%d_%H-%M"` docker exec app-mysql /usr/bin/mysqldump -u bitrix --triggers --events --routines --password=PASS1234 bitrix | gzip -9 > "$DATA"-backup.sql.gz
Если надо исключить таблицы, которые не нужны, то добавляем флаг --ignore-table=БД.Таблица
Для bitrix актуально следующее:
--ignore-table=bitrix.b_stat_referer_list --ignore-table=bitrix.b_stat_path --ignore-table=bitrix.b_event_log --ignore-table=bitrix.b_stat_guest --ignore-table=bitrix.b_stat_session --ignore-table=bitrix.b_stat_hit --ignore-table=bitrix.b_stat_page --ignore-table=bitrix.b_stat_referer --ignore-table=bitrix.b_stat_path_cache
От потерь этих таблиц, которые содержат статистику по сайту, никто сильно не пострадает, а бекап с 5гб может уменьшиться до 30мб
Настройки формы инфоблоков для пользователя находятся в табличке
b_user_option
С версии MySQL 5.1 поддерживается партиция, позволяя Вам распределить части индивидуальных таблиц по файловым системам согласно правилам, которые Вы можете устанавливать в значительной степени так, как необходимо. Типы Разбиения RANGE partitioning: назначает строки разделам, основанным на значениях столбца, попадающих внутрь заданного диапазона. LIST partitioning: подобно выделению разделов диапазоном, за исключением того, что раздел выбран основанным на столбцах, соответствующих одному из набора дискретных значений. HASH partitioning: раздел выбран основанным на значении, возвращенном определяемым пользователем выражением, которое функционирует на значениях столбца в строках, которые будут вставлены в таблицу. Функция может состоять из любого выражения, допустимого в MySQL, которое выдает не отрицательное целочисленное значение. KEY partitioning: подобно выделению разделов hash, за исключением того, что обеспечены только один или большее количество столбцов, которые будут оценены, и сервер MySQL обеспечивает собственную хэш-функцию. Эти столбцы могут содержать не целочисленные значения, так как хэш-функция, обеспеченная MySQL, гарантирует целочисленный результат, независимо от типа данных столбца. От слов к практике. На примере Таблица разбитая на 2 раздела с типом LIST CREATE TABLE 'contact` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `created` DATETIME NOT NULL, `text1` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `text2` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `file_name` VARCHAR(40) NOT NULL COLLATE 'utf8mb4_unicode_ci', `pn` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1', PRIMARY KEY (`id`,`pn`) USING BTREE, INDEX `file_name_idx` (`file_name`) USING BTREE ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=3794499 /*!50100 PARTITION BY LIST (pn) (PARTITION p0 VALUES IN (0) ENGINE = InnoDB, PARTITION p1 VALUES IN (1) ENGINE = InnoDB) */; Тут стоит обратить внимание на строчку PRIMARY KEY (`id`,`pn`) USING BTREE, Если не добавить в PRIMARY KEY столбец pn то ничего не выйдет. Для меня в данном случае, разбиение на партиции была нужна для того, чтобы быстро удалять данные относящиеся к 0 или к 1 партиции. Делается это командой ALTER TABLE contact TRUNCATE PARTITION p0; Которая за 1 сек может удалить миллионы строк (по сути удаляет файл) из партиции p0 На физ уровне будет два файла таблицы: contact#P#p0.ibd contact#P#p1.ibd Хорошая документация тут http://www.rldp.ru/mysql/mysqlpro/parts.htm Кстати, update по столбцу pn происходит очень долго, и после такого апдейта команда ALTER TABLE contact TRUNCATE PARTITION p0; тоже происходит не мгновенно
Проблема: бывает так, что при вызове soap, ответ на стороне клиента не собирается в объект, это может быть и из-за wsdl или из-за неверного ответа от сервер.
Решение: распарсить ответ от сервере как XML
// выполняем функцию SOAP $response = $this->client->__soapCall("getParam", $param); // костыль, так как первый response ничего не вернул, будем тупо парсить XML ответ $response = $this->client->__getLastResponse(); // xml парсеру не нравится тег с неймспейсами, вырезаем их $response = str_ireplace(array('soapenv:', 'tem:', 'SOAP-ENV:', 'rpc:'), '', $response); $xml = simplexml_load_string($response, "SimpleXMLElement", LIBXML_NOCDATA); $json = json_encode($xml); $arrayResponse = json_decode($json,TRUE);
Если есть ошибка при разборе, можно поиграть с параметрами
$xml = simplexml_load_string($response, «SimpleXMLElement», LIBXML_COMPACT | LIBXML_PARSEHUGE);
В книге «Symfony 5. Быстрый старт» есть хороший пример, когда нам надо выполнить какие то долгие действия (отправить почту, вызвать сторонний API) но не заставлять пользователя ждать. Для этого используется очередь. Мы в очередь записываем действие, сразу отправляем ответ пользователю а дальше уже, в другом скрипте делаем задачи из очереди.
Но если по каким то причинам, вы не можете поставить rabbitmq или вам это будет «ДОРОГО», считай излишни, можно обойтись таким асинхронным выполнением. Суть его в том, что все действия делаем быстро, отдаем ответ клиенту, а потом уже, когда он отключился, продолжаем выполнять свои задачи:
<?php // Игнорирует отключение пользователя ignore_user_abort(true); //позволяет скрипту быть запущенным постоянно set_time_limit(0); // старт буфиризации ob_start(); // вывести результат в буфер echo $result; $length = ob_get_length(); header('Connection: close'); header("Content-Length: " . $length); header("Content-Encoding: none"); header("Accept-Ranges: bytes"); // отключаем буфиризацию ob_end_flush(); // сбросить (отправить) буфер вывода ob_flush(); // сброс системного буфера вывода flush(); // а вот тут уже делаем все остальное
По такому принципу у меня работает Telegram бот, он на входе принимает сообщение с внешнего источника, и тут же отключает этот источник от себя, а уже дальше отправляет сообщение в телегу