【问题标题】:Concurrency with shell_exec() in PHP与 PHP 中的 shell_exec() 并发
【发布时间】:2011-12-08 16:45:32
【问题描述】:

我有一个 Web 应用程序,它在 PHP 中使用 shell_exec() 运行 FontForge shell 命令。我担心潜在的并发问题。有没有办法让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 目前是“开放”字体。

【问题讨论】:

  • 你在运行什么样的命令?他们是做什么的?
  • 它会有不同的 PID.. 否则会有什么问题?
  • 我用一个例子更新了帖子......
  • 只需为每个用户使用不同的输出文件(例如带有 IP 前缀)。
  • 这与源文件和输出文件以及如何管理参数有关。此外,我怀疑您正在向您的用户敞开心扉,让他们在您的服务器上执行他们想要的任何操作。无论如何,如果您希望得到体面的帮助,则需要更多信息。

标签: php shell-exec fontforge


【解决方案1】:

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

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

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

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

【讨论】:

  • 任何一个用户一次只能转换一种字体(作为政策问题),所以我只担心多个用户之间的冲突。不幸的是,我认为队列是做到这一点的唯一方法。正如我上面提到的,FontForge 一次只将一种字体定义为“打开”。任何命令都只会作用于 'open' 字体,因此仅靠唯一的文件名并不能解决问题(我已经在 PHP 中使用 uniqid() 命令创建了唯一的文件名)。
  • 现在我想想,两个shell命令是否有可能同时运行?一个人不会自然而然地等待另一个人吗?
  • 如果它们被两个不同的网络请求调用,它们绝对可以同时运行。
  • 感谢 webbiedave - 这很有道理。
猜你喜欢
  • 2011-06-23
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 2012-02-13
  • 2014-03-04
相关资源
最近更新 更多