1. PHP / Говнокод #26602

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    for ($cycle = 1; $cycle <= 6; $cycle++) {
        $all_tasks = get_all_tasks();
        if ($all_tasks) {
            foreach($all_tasks as $one_task) {
                $lock_file_abs = __DIR__.'/locks/run_'.$one_task['id'];
                $fp = fopen($lock_file_abs,"w+");
                if (flock($fp, LOCK_EX | LOCK_NB)) {
                    solve_one_task($one_task);
                    flock($fp, LOCK_UN);
                }
                else {
                    #не можем запускать обработку задачи
                }
                fclose($fp);
                unlink($lock_file_abs);
            }
        }
        sleep(10);
    }

    «Как запускать cron чаще, чем раз в минуту при помощи PHP»
    https://habr.com/ru/post/498934/

    Запостил: gost, 25 Апреля 2020

    Комментарии (20) RSS

    • В представленном виде есть одна неопределенность, а именно — повторное
      выполнение задачи в случае, если она уже начата. Это становится особенно
      актуально, если задача «сложная» и требует несколько секунд на ее реализацию.
      
      Таким образом создается проблема повторного выполнения:
      
      ● Функция solve_one_task() уже запущена, но еще не завершила свою работу;
      ● Следовательно, в базе данных до сих пор задача отмечена как невыполненная;
      ● Следующий цикл опять получит эту задачу и запустит функцию solve_one_task()
      еще раз, с этой же самой задачей.
      
      Разумеется, это можно решить, например, изменением какого-то статуса в базе данных по этой задаче.
      
      Но мы не будем нагружать базу данных: исходя из моего тестирования, MYSQL
      может принять запрос, но обработать его не сразу. Различие даже в 0.5 секунд
      может привести к повторному выполнению — что категорически не подходит.

      Именно поэтому я против «MYSQL».
      Ответить
      • лол, опять квадратноколесные велоспеды

        Задачи можно хранить в MSMQ или RabbitMQ.
        Выполнять можно через spring-integration или apache camel и celery: там везде уже стоит защита от "повторого выполнения"

        но пыхоблядь слишком тупа, и думает, что кроме mysql и крона ничего нет на свете
        наверняка там еще есть свой класс Db
        Ответить
        • https://www.php.net/manual/ru/book.zmq

          https://www.php.net/manual/en/intro.mqseries.php

          https://www.php.net/manual/en/book.sem

          https://www.php.net/manual/en/book.gearman.php

          https://www.php.net/manual/en/book.stomp.php

          https://framework.zend.com/manual/1.12/en/zend.queue.introduction.html

          http://web.archive.org/web/20180418234618/rediska.geometria-lab.net/documentation/integration-with-frameworks/zend-framework/zend_queue-adapter/
          Ответить
          • Разумеется там всё есть, но пыхеры этим не пользуются.
            Брейн демдж их настолько глубок, что им физически не представить себе что задачу можно решить чем-то кроме крона и майсикула.

            Главная проблема пых же не в том, что он язык говеный (питон тоже так себе язык местами), а в том, что пхп портит мозги.

            Эти говнорешения с кроном и мускулем он же не с потолка взял: они описаны в книгах, на форумах, всё коммунити о нем знает. Говно -- часть философии
            Ответить
        • Селера кстати может привести к малость оверинжерингу. Допустим, ты берешь селеру с RabbitMQ.

          Rabbit писан на эрланге. Эрланг запускает виртуальную машину (BEAM) -- тн ноду. Внутри ноды запускает приложение.
          Ноды могут общаться между собой по RPC, однако списоком нод на хосте заведует портмаппер epmd.
          1. epmd открывает порт
          2. каждая нода на хосте котрывает порт для RPC, и регистрируется в epmd
          3. RabbitMQ открывает порт для AMPQ и опцилаьно плагин для веб-морды открывает еще одинр порт

          И того у нас два процесса и четыре порта
          (rabbitmqctl запускает еще одну BEAM, через epmd находит ноду с rabbit, и шлет ей комманды)

          Внутри ноды работают rabbitmq, мониторинг, mnesia (в ней кроль хранит настройки и очередь сообщений) да еще и мнезийная папка зависит от имени хоста (нода@хост) так что переименовав хост можно пососоать писон.

          Вся это мандала ради того, чтобы селера своим воркерам (которых может быть вообще один) ставила задачу.

          Ну ёбушки-воробушки, это вы бы еще кафку сюда притащили
          Ответить
    • Да, а больше всего доставляет подпись автора статьи:
      Roman @RomanRuzin
      Специалист по автоматизации бизнес процессов

      Какая автоматизация бизнес-процессов )))
      Ответить
      • Автоматизация бизнес-процессов посредством говноскрипта на пхп, выполняемого по крону
        Ответить
      • несколько раз в минуту отправлять сотрудникам браузерные уведомляшки "работай тварь"
        Ответить
    • Какой велик )))
      Ответить
    • Не могу найти, но я такое же своё говно вылаживал.
      Ответить
    • ебанутые долбоёбы

      https://www.freedesktop.org/software/systemd/man/systemd.timer.html
      https://www.freedesktop.org/software/systemd/man/systemd.time.html

      А вообще конечно
      http://www.celeryproject.org/
      и в пизду крон
      Ответить
      • там в комментариях ему настойчиво рекомендуют supervisord, хорошо что не pm2
        Ответить
    • > Для некоторых задач по автоматизации бизнес процессов максимально допустимая задержка часто составляет не более чем 1-1.5 секунды.
      - интересно, что это за задачи? Выгружать в csv данные о том, сколько галерные макаки мышкой не щёлкали, сидя на удалёнке?
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • i will data parsing
        i will create cartoon avatar profile picture

        сразу видно успешного программиста
        Ответить

    Добавить комментарий