Параллельность с shell_exec() в PHP
У меня есть веб-приложение, которое запускает команды оболочки FontForge, используя shell_exec()
в PHP. Я беспокоюсь о возможных проблемах параллелизма. Есть ли способ сделать shell_exec()
открыть уникальный экземпляр для каждого пользователя?
Одна из команд позволяет пользователям конвертировать шрифты из одного формата файла в другой:
$command = "fontforge -c 'Open($1); Generate($2)' ".$format1." ".$format2;
shell_exec($command);
Я обеспокоен тем, что если ПОЛЬЗОВАТЕЛЬ А открывает FONT A, а ПОЛЬЗОВАТЕЛЬ B немедленно открывает FONT B (до вызова команды Generate() для ПОЛЬЗОВАТЕЛЯ A), то ПОЛЬЗОВАТЕЛЬ A по ошибке получит FONT B, так как FONT B в настоящее время является "открытым" шрифт.
1 ответ
Вам нужно не только беспокоиться о столкновении двух пользователей, но и о столкновении одного пользователя с самим собой по нескольким запросам.
Чтобы попытаться форсировать один запрос на действие шрифта для каждого пользователя, вы можете создать pid-подобные файлы (но с использованием идентификатора пользователя вместо идентификатора процесса) или создать очередь запросов (например, в таблице базы данных) и периодически создавать демона. проверить эту очередь (установка working
столбец к 1
) для запросов конкретного пользователя. Соедините это с уникальными временными рабочими каталогами для пользователя, и столкновения будут маловероятными.
Любой из этих подходов может застрять (процесс завершается до того, как он сможет очистить механизм). С этим можно бороться, если процесс демона очистит working
флаги при его перезапуске.
Если вы не беспокоитесь об одновременных запросах (через политику) и просто хотите избежать коллизий, вы можете отказаться от любых демонов и заставить свой PHP-скрипт копировать файлы шрифтов во вновь созданную папку с уникальным именем для каждого запроса, а затем копировать полученный шрифт. из этого по завершении.