PHP 中与 shell_exec() 的并发

发布于 2024-12-20 09:05:42 字数 416 浏览 1 评论 0原文

我有一个 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 当前是“开放”字体。

I have a web application which runs FontForge shell commands using shell_exec() in PHP. I'm worried about potential concurrency issues. Is there a way to make shell_exec() open a unique instance for each user?

One of the commands allows users to convert fonts from one file format to another:

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

I'm worried that if USER A opens FONT A and USER B immediately opens FONT B (before the Generate() command for USER A is called), then USER A would mistakenly receive FONT B, since FONT B is currently the 'open' font.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

隐诗 2024-12-27 09:05:42

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

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

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

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

You not only have to worry about two users colliding but also one user colliding with himself via multiple requests.

To try and force one font action request per user, you could create pid-like files (but using user id instead of the process id) or you could create a queue of requests (e.g., in a database table) and have a daemon periodically check this queue (setting the working column to 1) for requests by a particular user. Couple this with unique temp working directories per user and collisions will be unlikely.

Either approach has the potential for getting "stuck" (process ends before it can clear the mechanism). This can be combatted by having the daemon process clear the working flags upon its restart.

If you're not worried about simultaneous requests (via policy) and simply want to avoid collisions, you can forgo any daemons and have your PHP script copy the font files into a newly created uniquely named folder for each request, then copy the resulting font out of it upon completion.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文