如何在PHP中使用多线程

时间:2012-05-07 13:44:09

标签: php multithreading ffmpeg

我现在正在开发一个关于在互联网上分享视频的网站。 流程如下:    用户上传视频 - >服务器端接收视频并使用ffmpeg将视频格式转换为flv - >用户继续在网站上做其他事情。    现在我想建立另一个线程来进行转换工作(使用ffmpeg将视频格式转换为flv),这样用户可以做其他事情而无需等待视频转换为flv。但不知道怎么做!

6 个答案:

答案 0 :(得分:6)

PHP不支持线程。您应该使用cron脚本运行的后台任务来执行此操作。

您可以拥有一个包含要处理的作业的表,例如,包含磁盘上的文件名,状态(挂起,转换,就绪)等,然后让脚本获取所有挂起的作业,更改其状态转换,转换文件,然后将状态更改为就绪。这样,您还可以向用户显示信息,如果您希望同时转换多个文件,则可以运行多个脚本。

答案 1 :(得分:2)

制作需要转换的视频队列,然后使用cron作业逐个转换视频。此队列可以存储在消息队列或数据库之类的内容中。

使用数据库,您可以创建一个包含列IDStartDatetimeEndDatetimeFilenameStatusOwner和上传视频时适当设置。当某些用户请求他或她的任何视频的状态时,您只需在数据库中查找状态,其中(例如)1 =已添加,2 =当前正在处理,3 =已完成,4 =错误。< / p>

现在你的cron作业开始逐个处理所有项目,状态等于1;处理时将其更新为2,然后适当地更新为3或4。


通过所有fork / exec / run-on-background类解决方案,您可以立即开始处理上传的视频,这样您就可以让所有用户扼制服务器。如果多个用户同时开始处理大型视频会怎样?您无法控制单独的进程,并且所有进程都在同时运行,可能会严重降低您的服务器速度。

通过使用一个进程(从cron开始)顺序处理项目,您可以更好地管理正在使用的资源。

答案 2 :(得分:2)

看起来像job server的工作。只需将其添加为background task

即可

答案 3 :(得分:1)

PHP不以任何方式,形状或形式进行多线程处理。你可以用一些方法伪造它,但它们不是真正的“线程”:

  1. ignore_user_abort(TRUE)允许脚本在用户断开连接后继续运行。
  2. exec()可以在shell级别启动一个可以在后台运行的新进程,但这将是一个完全独立的进程,无法通过父脚本控制而无需额外的措施
  3. pcntl_fork()将创建当前脚本的克隆,然后可以继续处理,但同样将在名义上独立于父脚本。这需要pcntl扩展名可用,并且在Web请求的上下文中使用时不安全。

答案 4 :(得分:1)

我认为人们通常会转向Gearman来完成这些任务:http://php.net/manual/en/book.gearman.php

答案 5 :(得分:0)

您可以将ffmpeg生成为后台进程。 请参阅详细说明here

我建议在某处保存上传的视频文件,然后在其上运行ffmpeg,并显示“处理文件..”,直到创建文件为止(但是你没有等到ffmpeg,只是检查它是否创建了文件)。

另一种选择是将文件放在某些目录中,例如/ videos。然后创建一个cron作业,它将监视/ videos文件夹并转换任何新文件。

当然,您可以考虑更复杂,更安全的方法。