0

shell_exec()我有一个使用PHP运行 FontForge shell 命令的 Web 应用程序。我担心潜在的并发问题。有没有办法shell_exec()为每个用户打开一个唯一的实例?

其中一个命令允许用户将字体从一种文件格式转换为另一种文件格式:

$command = "fontforge -c 'Open($1); Generate($2)' ".$format1." ".$format2;
shell_exec($command);

我担心如果 USER A 打开 FONT A 并且 USER B 立即打开 FONT B(在调用 USER A 的 Generate() 命令之前),那么 USER A 会错误地接收 FONT B,因为 FONT B 当前是“打开的”字体。

4

1 回答 1

1

您不仅要担心两个用户发生冲突,还要担心一个用户通过多个请求与自己发生冲突。

要尝试强制每个用户发出一个字体操作请求,您可以创建类似 pid 的文件(但使用用户 ID 而不是进程 ID),或者您可以创建一个请求队列(例如,在数据库表中)并定期拥有一个守护进程检查此队列(将working列设置为1)以查找特定用户的请求。将此与每个用户唯一的临时工作目录相结合,冲突将不太可能发生。

任何一种方法都有可能“卡住”(过程在清除机制之前结束)。这可以通过让守护进程working在重新启动时清除标志来解决。

如果您不担心同时请求(通过策略)并且只是想避免冲突,您可以放弃任何守护程序并让您的 PHP 脚本将字体文件复制到新创建的每个请求的唯一命名文件夹中,然后复制生成的字体完成后退出。

于 2011-12-08T16:58:54.820 回答