Параллельность с shell_exec () в PHP - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть веб-приложение, которое запускает команды оболочки 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 Ответ

1 голос
/ 08 декабря 2011

Вам нужно не только беспокоиться о столкновении двух пользователей, но и о столкновении одного пользователя с самим собой по нескольким запросам.

Чтобы попытаться форсировать один запрос на действие шрифта для пользователя, вы можете создать pid-файлы (но с использованием идентификатора пользователя вместо идентификатора процесса) или создать очередь запросов (например, в таблице базы данных) и иметь демон периодически проверяет эту очередь (устанавливая для столбца working значение 1) запросы определенного пользователя. Сопоставьте это с уникальными временными рабочими каталогами для пользователя, и столкновения будут маловероятными.

Любой подход может застрять (процесс завершается до того, как он сможет очистить механизм). С этим можно бороться, если демон-процесс сбросит флажки working при перезапуске.

Если вы не беспокоитесь об одновременных запросах (через политику) и просто хотите избежать коллизий, вы можете отказаться от любых демонов и попросить ваш скрипт PHP скопировать файлы шрифтов во вновь созданную папку с уникальным именем для каждого запроса , затем скопируйте полученный шрифт из него по завершении.

...