• На чем делать кластер postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для начала задаёте себе и отвечаете на вопрос "зачем?"
    Потому что геморроя, проблем и граблей очень много. Бонусы - сомнительны. Основной пласт проблем - как решить, что пора переключать мастер на другой хост, а не вернётся старый мастер из-за недолгого (а то и вовсе планового) лага сети? Это организационный вопрос и автоматикой он не решается. Самое счастье с автоматикой - схлопотать split brain и получить на этом долгий и увлекательный квест "как бы разъехавшиеся данные теперь подружить воедино"
    мастер-мастер = головная боль перманентно. Потому что фундаментальная CAP теорема, которую никто пока внятно не решил. Или у вас проблемы с консистентностью или с медленной из-за распределённых транзакций записью.

    Автоматика для failover'а, которую я не придумал как спровоцировать на split brain - patroni. Вроде работает. Но в продакшене видел пока только однажды.

    Процедуры (да и вообще запросы) имеет смысл делить:
    - пишущие. Любые, какие что-то пишут в базе (включая create temporary table). Это должны роутиться строго на мастер
    - читающие. Идут на реплики
    - долго читающие. Идут на отдельные slow реплики, которые могут заметно отставать от мастера, но которые не будут мешать деятельности проекта
    Ответ написан
    4 комментария
  • Как переделать функцию подсчет секунд?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    function sum_time()
    {
    	$totalSeconds = 0;
    
    	foreach (func_get_args() as $time)
    	{
    		sscanf($time, '%d:%d:%d', $hours, $minutes, $seconds);
    		$totalSeconds += ($hours * 60 * 60) + ($minutes * 60) + $seconds;
    	}
    
    	$hours = floor($totalSeconds / 3600);
    	$minutes = floor(($totalSeconds / 60) % 60);
    	$seconds = $totalSeconds % 60;
    
    	return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
    }
    
    // use example
    echo sum_time('01:05:37', '00:02:00', '05:59:59'); # 07:07:36
    Ответ написан
    Комментировать
  • Как высчитать время в помещении и вне помещения - согласно данным?

    27cm
    @27cm
    TODO: Написать статус
    <?php
    
    $empty = new DateTime('00:00:00');
    $inside  = clone $empty;
    $outside = clone $empty;
    
    $rows = [
        ['date' => '10.06.2015', 'time' => '10:12:42', 'enter-exit' => 1],
        ['date' => '10.06.2015', 'time' => '10:27:48', 'enter-exit' => 0],
        ['date' => '10.06.2015', 'time' => '10:30:28', 'enter-exit' => 1],
        ['date' => '10.06.2015', 'time' => '12:28:06', 'enter-exit' => 0],
        ['date' => '10.06.2015', 'time' => '12:30:17', 'enter-exit' => 1],
        ['date' => '10.06.2015', 'time' => '13:49:41', 'enter-exit' => 0],
        ['date' => '10.06.2015', 'time' => '14:04:56', 'enter-exit' => 1],
        ['date' => '10.06.2015', 'time' => '14:57:06', 'enter-exit' => 0],
        ['date' => '10.06.2015', 'time' => '15:11:13', 'enter-exit' => 1],
        ['date' => '10.06.2015', 'time' => '16:14:14', 'enter-exit' => 0],
        ['date' => '10.06.2015', 'time' => '19:10:21', 'enter-exit' => 1],
        ['date' => '10.06.2015', 'time' => '19:21:38', 'enter-exit' => 0],
    ];
    
    foreach ($rows as $row) {
        $datetime = $row['date'] . ' ' . $row['time'];
        $datetime = DateTime::createFromFormat('d.m.Y H:i:s', $datetime);
        
        if ($row['enter-exit']) {
            $enter = $datetime;
            if (isset($exit)) {
                $interval = $enter->diff($exit);
                $outside->add($interval);
            }     
        } else {
            $exit = $datetime;
            if (isset($enter)) {
                $interval = $exit->diff($enter);
                $inside->add($interval);
            }
        }
    }
    
    echo 'В офисе: '   . $empty->diff($inside)->format('%h:%I:%S') . '<br>';
    echo 'Вне офиса: ' . $empty->diff($outside)->format('%h:%I:%S');
    Ответ написан
    5 комментариев
  • Как сделать nginx redirect по регулярным выражениям?

    Ascendant
    @Ascendant
    PHP/AngularJS/Sphinx/nginx
    Адреса очень похожи и можно было бы обойтись одним выражением с модификатором /g:

    [0-9]+-([-\w]+)(\.html)?

    Но поскольку в nginx нельзя при разборе адреса использовать /g, то каждый случай надо разбивать отдельно:

    if ($uri ~ "/catalog/cat/[0-9]+-([-\w]+)\.html") {
      rewrite /catalog/cat/[0-9]+-([-\w]+)\.html /$1 redirect;
    }
    
    if ($uri ~ "/catalog/[0-9]+-([-\w]+)/[0-9]+-([-\w]+)\.html") {
      rewrite /catalog/[0-9]+-([-\w]+)/[0-9]+-([-\w]+)\.html /$1/$2 redirect;
    }
    
    if ($uri ~ "/catalog/[0-9]+-([-\w]+)/[0-9]+-([-\w]+)/[0-9]+-([-\w]+)\.html") {
      rewrite /catalog/[0-9]+-([-\w]+)/[0-9]+-([-\w]+)/[0-9]+-([-\w]+)\.html /$1/$2/$3 redirect;
    }


    Можно еще попробовать сделать через map.
    Ответ написан
    2 комментария