Параллельность с 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-скрипт копировать файлы шрифтов во вновь созданную папку с уникальным именем для каждого запроса, а затем копировать полученный шрифт. из этого по завершении.

Другие вопросы по тегам