Для получения полного доступа
зарегистрируйтесь.

Раздел:
Подраздел:
Языки:


Roman Zhuravlev
  • Репутация: 6
  • Сниппеты: 3
  • Ревизии: 0

Пусковой скрипт для запуска cron-команд в docker-контенере. Проверяет cron-выражение и запускает команду. Умеет выход по сигналам SIGTERM и SIGINT. В отличии от стандартного cron-демона следующую команду не запустит пока не выполнит предыдущую. Удобно использовать при разработке c docker-compose. В логах докера показывает что запускалось, когда, и с каким результатом.

#!/usr/bin/env php
<?php
/**
 * Скрипт для запуска команды по расписанию, для замены cron-а в сети из docker-контейнеров.
 *
 * Пример команды, которая будет запускаться каждую минуту:
 * docker/php/cron.php "* * * * *" php yii rate/update
 *
 * Зависимости:
 * "mtdowling/cron-expression": "~1.2.0"
 *
 * @author Roman Zhuravlev <zhuravljov@gmail.com>
 */

require(__DIR__ . '/../../vendor/autoload.php');

// Params
$params = $_SERVER['argv'];
array_shift($params);
$expression = array_shift($params);
$command = implode(' ', $params);
$schedule = \Cron\CronExpression::factory($expression);

// Signal handler
$signal = 0;
$signalHandler = function ($sigNum) use (&$signal) {
    $signal = $sigNum;
};
pcntl_signal(SIGTERM, $signalHandler);
pcntl_signal(SIGINT, $signalHandler);

// Loop
printLog('Cron started');
while (true) {
    sleep(60 - time() % 60);
    pcntl_signal_dispatch();
    if ($signal) {
        printLog("Cron stopped by signal $signal");
        exit(0);
    }
    if (!$schedule->isDue()) {
        continue;
    }
    $startedAt = microtime(true);
    printLog("[started] command: $command", $startedAt);
    passthru($command, $exitCode);
    $finishedAt = microtime(true);
    $totalTime = sprintf('%01.3f', $finishedAt - $startedAt);
    printLog("[finished] duration $totalTime s, exit code $exitCode");
    if ($exitCode) {
        exit($exitCode);
    }
}

function printLog($message, $time = null)
{
    echo date('Y-m-d H:i:s', $time ?? time()), ' ' , $message, PHP_EOL;
}
Kosuha606
  • Репутация: 11
  • Сниппеты: 11
  • Ревизии: 0

Функция, позволяющая перевести PhpOffice Spreadsheet в таблицу PhpWord Table, Чтобы напечатать таблицу в .doc файле. Пришлось сделать эту функцию, потому что перевод XLS->HTML и HTML->DOC работает плохо для таблиц.

Из недочетов метода:

  1. addCell - использует константую ширину ячейки, это можно доработать
  2. Объединение ячеек учитывается только по ширине, не по высоте.

Делал этот метод для того, чтобы основная логика генерации таблиц была в XLS и чтобы генерация DOC использовала эту таблицу уже готовую и вставляла таблицу в заготовленный шаблон DOC.

private function convertXlsToDocTable(Worksheet $sheet, Table $table)
{
    foreach ($sheet->getRowIterator() as $rowIndex => $row) {
        $table->addRow();
        $prevMergeRange = null;
        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(false);
        foreach ($cellIterator as $cellIndex => $cell) {
            $value = $cell->getValue();
            $mergeRange = $cell->getMergeRange();
            if ($mergeRange && $prevMergeRange == $mergeRange) {
                continue;
            }
            if ($mergeRange) {
                $mergeCount = 0;
                foreach ($row as $mergeCell) {
                    if ($mergeRange == $mergeCell['mergeRange']) {
                        $mergeCount++;
                    }
                }
                $table->addCell(2000, ['gridSpan' => $mergeCount])->addText($value);
                $prevMergeRange = $mergeRange;
            } else {
                $table->addCell(2000, [])->addText($value);
            }
        }
    }

    return $table;
}
Gravatar image
ivaaaan
  • Репутация: 3
  • Сниппеты: 1
  • Ревизии: 0
function urange($start, $end, $step)
{
    if (!is_callable($step)) {
        return range($start, $end, $step);
    }

    $helper = function ($current, $start) use ($end, $step, &$helper) {
        if ($start > $end) {
            return $current;
        }
        $current[] = $start;
        return $helper($current, $step($start));
    };
    
    return $helper([], $start);
}

print_r(urange(20, 39, function ($n) {
    $next = ($n / 10) % 10;
    return $n + ($next >= 1 ? $next : 1);
}));

print_r(urange(1, 40, function ($n) {
	return $n+1;
}));

print_r(urange(1, 40, function ($n) {
    return $n+$n;
}));
Stephen Berezuev
  • Репутация: 5
  • Сниппеты: 3
  • Ревизии: 1

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

docker-compose down --rmi all -v --remove-orphans;
docker-compose rm -f -s -v;
docker network rm `docker network ls -q`;
docker rm -f `docker ps -qa`;
docker rmi -f `docker images -q`;
[[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell

ВНИМАНИЕ: Запускать аккуратно, ибо выпиливает без предупреждения все контейнеры, образы, сети и тома докера.

В процессе выполнения иногда кидает ошибки о том, что нечего удалять - это нормально.

dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Если SF3 ставить на Docker, без лишних заморочек с конфигурированием, отдача страницы будет около 30 сек, что очень долго. После долгого чтения гугла, я пробовал вариант с :cached, стало веселее - отдача страницы 2-3 секунды.

Проблема долгой отдачи страницы - много файлов. В папке vendor, cache, много файлов. Для быстрой отдачи страницы, мы должны игнорировать синхронизацию этих папок.

Вот простое решение задачи:

php:
    ...
    volumes:
    	- ${SYMFONY_APP_PATH}:/var/www/src
    	- ${SYMFONY_APP_PATH}/var/logs:/var/www/src/var/logs
    	- /var/www/src/vendor
    	- /var/www/src/var/cache

Код выше синхронизирует только исходные коды проекта и папку с логами, всё что ниже - игнорируется.

Gravatar image
Доктор Скальпинг
  • Репутация: 2
  • Сниппеты: 0
  • Ревизии: 1

На случай если вы не знали, Ctrl + R ищет команды которые вы вводили ранее. Бывает так, что начало команды одно, и вы не можете посмотреть следующий результат поиска. Например:

ssh root@216.3.118.12
ssh root@52.111.13.175

Решение: нажмите Ctrl + R в режиме поиска, если хотите получить следующий результат.

samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Иногда требуется показать текущее время в другом часовом поясе. Сделать это можно вот так:

function getCurrentTimeWithOffset(timezoneOffset) {
    var tzDate = new Date((new Date()).getTime() + (3600000 * timezoneOffset));
    return tzDate.getUTCHours() + ':' + (tzDate.getUTCMinutes() < 10 ? 0 : '') + tzDate.getUTCMinutes();
}
Gravatar image
Archakov06
  • Репутация: 1
  • Сниппеты: 0
  • Ревизии: 1

ES6:

const randomColor = () => {
  return `#${((1<<24)*Math.random()|0).toString(16)}`;
}
console.log(randomColor());

ES5:

var randomColor = function() {
  return '#' + ((1<<24)*Math.random()|0).toString(16);
}
console.log(randomColor());
Сниппет,  Bash

docker short command

alex912004
  • Репутация: 8
  • Сниппеты: 3
  • Ревизии: 0

Остановить все контейнеры

docker stop $(docker ps -a -q)

Удалить все контейнеры

docker rm -f $(docker ps -q -a)

Удалить все образы

docker rmi -f $(docker images -q)
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Intervention Image — библиотека с простым API для работы с изображениям.

Что библиотека умеет:

  1. изменение размера
  2. обрезка
  3. добавление прозрачности
  4. добавление блюра
  5. кеширование изображений
  6. и многое другое

Вы можете использовать Intervention Image двумя способами:

// open an image file
$img = Image::make('public/foo.jpg');

// now you are able to resize the instance
$img->resize(320, 240);

// and insert a watermark for example
$img->insert('public/watermark.png');

// finally we save the image as a new file
$img->save('public/bar.jpg');

Либо, через цепочку вызовов:

$img = Image::make('public/foo.jpg')
    ->resize(320, 240)
    ->insert('public/watermark.png')
    ->save('public/bar.jpg');

Помимо статического вызова, можно создать объект, и работать с ним:

// include composer autoload
require 'vendor/autoload.php';

// import the Intervention Image Manager Class
use Intervention\Image\ImageManager;

// create an image manager instance with favored driver
$manager = new ImageManager(array('driver' => 'imagick'));

// to finally create image instances
$image = $manager->make('public/foo.jpg')->resize(300, 200);

Для разработчиков Laravel, всё работает из коробки.

Ссылки
Репозиторий на Github
Документация