2012-07-23 35 views
1

我有一个C模拟,我正在创建一个图形化的Web界面。我用ajax来调用PHP,然后调用shell来运行模拟。输出然后传回到网页。PHP调用shell脚本来处理多个用户

脚本会生成一个输出文件(带有输出到网页的链接)以及一个图形(使用调用gnu plot并引用输出文件)。该网页还允许用户上传用于C仿真的输入文件。所有这些文件都是用户特定的。

如果一次只有一个用户在网页上,没有任何问题。但是,如果有5个人想要同时运行模拟,用户特定的文件(输出,图形,输入)将被覆盖并混乱。

我没有任何MySQL的经验,我也不打算保存给定用户的输出或输入(用户可以下载他们,如果他/她愿意),所以我希望可能有一个相当简单的解决方案,例如,在服务器上生成一个临时目录,并根据用户的IP地址或名称在名称中添加某种标识标签。这个文件夹可以在模拟运行几分钟后被删除。任何人有任何关于这样的想法?或者我会不得不求助于MySQL?

编辑:也可以让最多5个用户同时运行,然后为其他用户创建一个队列,但这可能会更困难。

感谢, 乔希

+0

如果您发送链接到输出回到用户,不应该输出存在更长,然后几分钟?也许是 – hackattack 2012-07-23 19:36:40

+0

。输出包含一个数字(三维数值积分的结果),一个包含分布(积分范围内的较小范围)的文件和一个图形。输出只在下载格式中非常有用,所以我想用户会抓住它或不想要它。但“几分钟”只是一个例子。 – jroz 2012-07-24 16:39:41

回答

2

你不能没有保存输出某处,所以你的临时目录计划是好的。

  • 通过md5()或sha1()或其他方式为每个新用户分配一个唯一的ID。
  • 将id传递给模拟器,并让它在由该id命名的子目录中创建其输出文件。
  • 根据该ID渲染链接和映像HREF ..
  • 编写一个cron以定期清除陈旧的子目录。

每个人都会在一个不可猜测的URL上获得他们自己的输出集。

+0

这正是我所想的,甚至直到使用cron来清除目录。我只是想确保我走在正确的道路上。我也不是很了解session id,所以md5()和sha1()是开始我的谷歌搜索的好地方。 – jroz 2012-07-24 16:42:49

+0

呵呵,我不会说这是“正确”的道路,只是众多可能之一。 – 2012-07-24 16:56:50

1

也许你可以在你的C模拟使用Threading。或者,您可以设置一个MySQL数据库并使用PHP Database Objects (PDO)将数据存储在那里。如果你可以使用C并且能够使用PHP来做Ajax,那么mysql可能是最具时间效率的解决方案,而不是C中的线程(假设C仿真比较复杂)。

1

您可以为访问用户创建会话标识并将该ID作为参数传递给您的c程序。

当您的c程序创建文件供用户显示时,它应该使用该用户的会话标识符生成名称。

从网页上让用户查看与其会话标识符相匹配的文件。通过这种方式,他们可以看到他们生成的文件,并且如果用户拥有带有会话标识符的文件,则不需要对C程序进行不必要的调用,就可以对用户进行控制。

只是为已经创建的那个服务。根据您的需要控制该标识符的使用寿命。