2010-03-13 52 views
3

hy,如何在MySQL中使用php队列

在我的脚本中,我运行一个exec()函数来制作带有ffmpeg的电影文件。

问题是ffmpeg的可以在服务器上运行的只有1次,

如果2人是联机服务器和第一个已经运行的ffmpeg我希望第二个要等到第一端的进程

如何编码?

谢谢

回答

3

在某处设置锁。

当ffmpeg启动时,在文件或数据库表中设置一个标志,将其标记为正在进行中。每次ffmpeg启动时,都要检查标志值是否为'1',如果是,请等待并在5或10秒内重试。然后当过程结束时,将标志设置为'0'。确保它是否崩溃或者你的脚本有错误,标志被设置回'0'。

或者,您可能会以不同的用户身份运行ffmpeg进程,并且一次运行多个进程。

+0

如何以不同的用户身份从php运行进程? – robert 2010-03-13 02:41:55

+0

这可以工作,并且很快,但方式效率不高。在共享主机上,您会在执行此类操作时被禁止。 – Alfred 2010-03-13 03:08:02

+0

@robert如果你在共享主机上,很可能你不能像其他用户那样运行某些东西,除非你有多个帐户。 – JAL 2010-03-13 06:50:30

3

对于耶布斯,don't implement your own queue的爱。编写一个守护进程来拾取消息并处理这些文件。

+3

+1将Jebus拖入此:) – 2010-03-13 02:36:20

+0

我无法编译和安装librabbitmq!我无法访问根服务器 – robert 2010-03-13 02:38:10

0

您可以使用异步队列。每个新请求都会作为消息添加到队列中。您的进程一次只读取一条消息并处理转换请求。

对于PHP队列,您可以尝试Dropr或类似的方法。

2
  1. 你为什么不使用video hosting service(免费),像这个例子的YouTube/VIMEO这是更好的方式来处理这个,那么你可能永远不会准备。 Youtube有各种各样的东西API
  2. 您是从shared hosting运行exec?如果被警告禁止,因为共享主机不喜欢你以这种方式使用CPU。他们想要短暂的Http请求(在30秒内)。其余不适用于您的托管,您应该先升级。
  3. 就像伊格纳西奥说,你应该安装一个消息队列(需要有shell访问的Linux机器)例如像:

    1. redis如果你有SSH访问Linux机器上安装将是最简单的方式Redis的。然后,当准备好处理视频时,您的长时间运行的fffmpeg进程(php脚本)应该连接到redis并从队列中逐个获取消息。客户端应该简单地将消息放在队列中。我建议看这个快速的video来获得redis的基础知识。
    2. beanstalkd
    3. gearman

希望这有助于你一点点。我也正在用java编写一个简单的任务队列,但我还没完全完成。希望在大约一周内,我可以在github上提交我的第一个版本。

+0

谢谢,祝你好运 – robert 2010-03-13 05:19:12