Подскажите можно ли реализовать следующую задачу, я новичок. Смысл в чем есть внешний скрипт, написан на bach, вызываю его через exec(), но дело в том что он может работать только в 1 поток, если 2 пользователя запустят его одновременно то он работать не будет как положено, сразу будут ошибки и т.д...Я долго думал как реализовать очередь, пока только придумал, что надо проверить если этот скрип запущен, то sleep(5) и так пока он не завершится, но это не очень хорошая идея..Поэтому решил написать, может кто сталкивался или у кого есть идея??
Если не нужно чтобы запускалась вторая копия, при старте проверяйте запущен-ли уже другой экземплер и, если да, то завершаете выполнение. прим: exit('job is still running');
Не совсем так, нужно чтобы 2-я копия( там скрипт принимает уникальные аргументы и выполняется от 1 до 7 мин) встала в очередь и как только завершиться 1 поток сразу запустить 2-ю.
Они у вас отвалятся когда завершится время выполнения Если останутся висеть бесцельно. Не говоря уже про отъедаемые ресурсы. Всё проще: записывайте задания в оередь, например в таблицу бд., добавьте крон-таск на запуск скрипта (прим. раз в 2 минуты) который будет отрабатывать если есть задача в очередь на запуск и если не запущен другой экземпляр.
что мешает использовать бд ? поля такие id | время запроса | кто запросил | состояние запроса | ответ ну и примерно вот так должно работать select * from tbl where 'состояние запроса' = работает ну и дальше если это 0 - то запускать иначе написать что запрос выполняется ну или что там требуется.
Я бы поспорил, можно и так реализовать, но грустно. Можно же форкать подпроцессы, как раз с таблицей или редиску привязать.
Спасибо 2 толковые идеи есть, а то я уже голову сломал как лучше... Получается мне надо записывать очередь в отдельную таблицу в базу данных и вызывать с помощью крона, правильно я понял?
вай .. какой нафик крон ? человека зашел - открылась страничка - пошла проверка .. не зашла человека .. незачем и проверять