За последние 24 часа нас посетили 55013 программистов и 1725 роботов. Сейчас ищут 935 программистов ...

Очередь из команд.

Тема в разделе "PHP для новичков", создана пользователем AnonimS, 11 дек 2016.

Метки:
  1. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    Подскажите можно ли реализовать следующую задачу, я новичок. Смысл в чем есть внешний скрипт, написан на bach, вызываю его через exec(), но дело в том что он может работать только в 1 поток, если 2 пользователя запустят его одновременно то он работать не будет как положено, сразу будут ошибки и т.д...Я долго думал как реализовать очередь, пока только придумал, что надо проверить если этот скрип запущен, то sleep(5) и так пока он не завершится, но это не очень хорошая идея..Поэтому решил написать, может кто сталкивался или у кого есть идея??
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Если не нужно чтобы запускалась вторая копия, при старте проверяйте запущен-ли уже другой экземплер и, если да, то завершаете выполнение. прим: exit('job is still running');
     
  3. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    Не совсем так, нужно чтобы 2-я копия( там скрипт принимает уникальные аргументы и выполняется от 1 до 7 мин) встала в очередь и как только завершиться 1 поток сразу запустить 2-ю.
     
  4. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Они у вас отвалятся когда завершится время выполнения Если останутся висеть бесцельно. Не говоря уже про отъедаемые ресурсы.
    Всё проще: записывайте задания в оередь, например в таблицу бд., добавьте крон-таск на запуск скрипта (прим. раз в 2 минуты) который будет отрабатывать если есть задача в очередь на запуск и если не запущен другой экземпляр.
     
  5. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    что мешает использовать бд ?

    поля такие

    id | время запроса | кто запросил | состояние запроса | ответ

    ну и примерно вот так должно работать

    select * from tbl where 'состояние запроса' = работает


    ну и дальше если это 0 - то запускать иначе написать что запрос выполняется ну или что там требуется.
     
  6. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Я бы поспорил, можно и так реализовать, но грустно.
    Можно же форкать подпроцессы, как раз с таблицей или редиску привязать.
     
  7. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    Спасибо 2 толковые идеи есть, а то я уже голову сломал как лучше... Получается мне надо записывать очередь в отдельную таблицу в базу данных и вызывать с помощью крона, правильно я понял?
     
  8. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    вай .. какой нафик крон ?

    человека зашел - открылась страничка - пошла проверка ..
    не зашла человека .. незачем и проверять
     
  9. AnonimS

    AnonimS Новичок

    С нами с:
    8 дек 2016
    Сообщения:
    88
    Симпатии:
    9
    Ну да, логично, ладно спасибо.