• Как обрабатывать данные, сохраняя очередность?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Создайте отдельную очередь, в обработчике хука кладите туда задание и обрабатывайте её в один поток.
    Т.е. примерно то, что описал Виктор Кожухарь, только готовыми средствами фреймворка.
    Ответ написан
  • Как обрабатывать данные, сохраняя очередность?

    Пусть хук записывает всю необходимую информацию и, главное, время в специальную таблицу в базе данных. Это всё, что будет делать хук. Таким образом он будет работать всегда быстро и всегда за одно и то же очень малое время.

    Далее по крону или каким-то другим образом совершенно другой скрипт будет выбирать самую старую запись из этой таблицы и обрабатывать её, совершая необходимые действия. Далее эту запись либо удаляем либо помечаем обработанной и берём следующую запись
    Ответ написан
    4 комментария
  • Как изменить набор ключей в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кого на что меняем, объект вида { 'старый ключ': 'новый ключ' }:

    const keys = {
      x: 'a',
      y: 'b',
      z: 'c',
    };

    Собираем новый массив:

    const renameKeys = (obj, keys) =>
      Object.fromEntries(Object
        .entries(obj)
        .map(([ k, v ]) => [ Object.hasOwn(keys, k) ? keys[k] : k, v ])
      );
    
    // или
    
    const renameKeys = (obj, keys) =>
      Object.keys(obj).reduce((acc, k) => (
        acc[keys[k] ?? k] = obj[k],
        acc
      ), {});
    
    
    const newArr = arr.map(n => renameKeys(n, keys));

    Обновляем существующий:

    function renameKeys(keys, obj) {
      for (const k in keys) {
        if (obj.hasOwnProperty(k)) {
          obj[keys[k]] = obj[k];
          delete obj[k];
        }
      }
    }
    
    
    arr.forEach(renameKeys.bind(null, keys));
    Ответ написан
    Комментировать
  • Как решить Fatal error: Uncaught Error: Call to undefined function pll_register_string()?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    в подобных случаях помогает гугл.
    pll_register_string - и в выдаче видим, что это плагин вордпресса.
    Раз плагин, то проверяем он стоит ли вообще ?
    Дальше от гуглим запросы его название (Polylang) и что там не работает
    Ответ написан
    7 комментариев
  • Как сохранять клики и их время в кликере?

    @rPman
    вместо условных 100 кликов людям засчитывало ~40
    судя по sql у тебя количество сохраняемых кликов считается как сначала запросом получить текущее значение, затем сохранить его увеличенным... что естественно неправильно обсчитывается, если одновременно на бакэнд идут несколько запросов, и завершаются в разном порядке (т.е. первый, получил значение 1, затем его обогнал второй, получил то же значение 1, оба отправляют +1 значение, т.е. 2, вместо ожидаемого 3.

    Правильно: одним обновлением в базе нужно - проверять допустимость клика (проверить время последнего клика), обновить время последнего клика и увеличить количество кликов на 1... после чего бакэнд проверяет, сколько записей было обновлено, если 0 - значить выход за лимиты, если 1 - все ок.
    update set clicks=clicks+1, last_click_time=now() where last_click_time+:ALLOWED_CLICK_INTERVAL<now() and id=:current_id


    p.s. даже очень слабая машина позволит делать сотню запросов в секунду на обновление, а хорошая - десяток тысяч

    Можно больше, но тогда понадобится разнести таблицу аналитики и таблицу событий, в таблицу событий записывают события, но она без индексов, а в аналитику зааливать данные из всех собранных событий, в цикле
    Ответ написан
    Комментировать
  • Почему метод pop удаляет не все елементы массива?

    Wispik
    @Wispik
    1. Нельзя итерироваться по объекту и одновременно изменять его
    2. pop удаляет с конца, а for of идет по массиву сначала

    Первая итерация цикла number=3, pop удаляет с конца, то есть 5
    вторая итерация number=8, pop удаляет 9
    и так далее
    когда number=6(четвертая итерация), 6 - это последний элемент массива, так как остальные удалил pop
    Ответ написан
    2 комментария
  • Как найти в строке текст который содержит спецсимволы с помощью регулярного выражения?

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

    Регулярные выражения тут не нужны.

    Предлагаю просто отформатировать ответ от поставщика и вывести пересечения

    $items = array_intersect(
        $companyItems, // на сайте
        array_map(
            function (string $item) {
                $parts = explode(' ', $item);
                return end($parts);
            },
            $supplierItems // от поставщика
        ),
    );
    Проверка

    spoiler
    если не доставать отдельно имена товаров на сайте, можно собрать артикулы с товаров поставщика в один массив, пройтись по товарам на сайте и проверить in_array($item['name'], $supplierNames, true)
    Ответ написан
    8 комментариев
  • Почему такой неадекватный расход памяти?

    У утечки памяти может быть миллион разных причин. Искать их, просто читая код - это искать иголку в стоге сена.

    Поэтому, умные люди придумали профайлинг. Мы собираем статистику и пытаемся её отобразить в более-менее наглядном виде.

    Например, есть вот такой инструмент
    https://github.com/arnaud-lb/php-memory-profiler
    Readme очень подробный, и можно, в принципе, им и обойтись.

    Есть ещё вот такие видео, в которых всё более комплексно и подробно

    https://www.youtube.com/watch?v=NNMp-97rk9c&t=219s

    https://www.youtube.com/watch?v=56I5C0NYjv8&t=293s

    Удачи в поисках!
    Ответ написан
    1 комментарий
  • Можно ли проверить было ли уже событие window.onload?

    Elaryks
    @Elaryks
    Можно через document.readyState проверить состояние страницы:

    if (document.readyState === 'complete') {
       someFunction();
    } else {
       window.addEventListener('load', someFunction);
    }
    Ответ написан
    1 комментарий
  • Для чего тесты пишут?

    @Refguser
    Решения для бизнеса: от создания ИМ до...
    А в чем проблема проверить тогда без этого теста?

    Проверить - это уже тест. И ты имеешь ввиду ручной, а спрашиваешь "зачем пишут". Т.е. суть вопроса: "зачем пишут автотесты".
    Так вот, приближённая аналогия этого вопроса - "в чём проблема дойти из Москвы до Магадана пешком, зачем автомобили и самолёты?"

    Количество тестируемых точек может достигать нескольких тысяч, а то и десятков тысяч. Чтобы проверить их вручную нужно задействовать армию тестировшиков (которым нужно платить з/п, на сек) и массу человеко-часов.

    Итого: автотесты снижают стоимость и сокращают время.
    Ответ написан
    Комментировать
  • Для чего тесты пишут?

    includedlibrary
    @includedlibrary
    Тесты пишут, чтобы при изменениях в коде их прогонять и проверять, что определённое в тестах поведение не ломается. Да, можно каждый раз всё вручную прогонять, но вот для примера, у нас в проекте тысячи две автотестов, каждый раз всё это вручную прогонять ни у кого возможности нет
    Ответ написан
  • Есть ли способ для быстрого перевода готового html сайта в мобильную версию?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Да, есть: пачка денег плюс задача на фрилансе.
    Ответ написан
    1 комментарий
  • Объясните, почему так работает код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    потому, что воспринимает как десятичную точку
    2000.123

    Вот так, например, сработает: 2000.0.toLocaleString() — тут уже понятно, что не десятичная точка. Но я — за скобки!
    Ответ написан
    2 комментария
  • Как организовать хранение покупок при продаже услуг с разными характеристиками?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега MySQL
    У меня был проект с такой задачей (и тоже ресторанный). Особенностей у него три:
    • "магазины" могут закрываться, а набор товаров полностью меняется несколько раз в год;
    • заказов относительно немного, 200-400 тысяч в год;
    • история нужна для личного кабинета и набор полей там довольно ограничен.

    Исходя из этого, выбрали именно JSON, в который складывались все связанные модели ("магазин", "товар" и т.п.) в сериализованном виде. В таком виде они хранятся год-два на всякий случай, потом старые записи переносятся в архивную таблицу, где только реально используемые на странице истории поля со скалярными типами (путь к картинке, название "магазина" и т.п.).

    Но тут надо бы реальную задачу понимать. Может, не надо джойнить, а проще денормализовать данные и вести отдельные таблицы какой-то статистики? Или просто отдельно хранить те поля, по которым предполагается джойнить, а всё остальное пихать в JSON?
    В отрыве от конкретных задач вариант широкой "дырявой" таблицы мне кажется самым плохим, вариант с таблицей покупки, к которой полиморфично (properties_type, properties_id) привязаны таблицы со значениями свойств каждого типа сущности выглядит немного лучше.
    Ответ написан
    2 комментария
  • Как вывести теги из таблицы базы данных?

    sslion
    @sslion
    explode - читай
    Там ничего сложного в логике...
    Ответ написан
    Комментировать
  • Почему методы массива могут принимать параметр колбек, а промис нет?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Либо
    Promise.all([4, 5, 6])
      .then(console.log)
      .catch(console.log);

    либо
    Promise.all([4, 5, 6])
      .then(data => console.log(data))
      .catch(err => console.log(err));
    Ответ написан
    Комментировать
  • Почему docker при запуске не может найти пакет xdebug?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    Пакет называется php-xdebug, а не xdebug, но даже если указать имя правильно пакет не установиться, потому что в репозитрии его на самом деле нет. Устанавливай его из pecl или используй Debian в качестве базового образа и устанавливай пакеты из репозитория https://packages.sury.org/php/ (я бы даже рекомендовал делать так потому что образ получиться меньше размером).
    Ответ написан
    Комментировать
  • Как в js обновить список нод в querySelectorAll и их EventListener после удаления ноды?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    слушайте событие клика как jQuery – не на каждой кнопке по отдельности, а один раз на общем родителе: на этом .show-cart

    В обработчике проверяйте, по чему именн, там, где-то в дочерних, кликнули (см. event.target). Если у кликнутого есть класс .delete-item, то действуем далее.

    Слушать на общем родителе – называется волшебным термином «делегирование событий».
    Ответ написан
    1 комментарий
  • Как уменьшить вес gif с помощью php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    GIF использует lzw-сжатие без потерь. Уменьшить размер файла можно только убрав часть информации, то есть уменьшив разрешение изображения или количество цветов.
    Ответ написан
    1 комментарий