我现在正在开发一个关于在Internet上共享视频的网站。 流程如下: 用户上传视频 - >服务器端接收视频并使用ffmpeg将视频格式转换为flv - >用户在网站上做其他事情。 现在我想建立另一个线程来做转换工作(使用ffmpeg将视频格式转换为flv),以便用户可以在不等待视频转换为flv的情况下做其他事情。但不知道如何!如何在php中使用多线程
回答
PHP不支持线程。您应该使用由cron脚本运行的后台任务来执行此操作。
你可以有一个包含待处理作业的表,例如,包含磁盘上的文件名,状态(挂起,转换,准备好)等等,然后让脚本获取所有挂起的作业,更改它们状态转换,转换文件,然后将状态更改为就绪。这样您也可以将信息呈现给用户,并且如果您希望同时转换多个文件,则可以运行多个脚本。
或者他可以fork php进程 –
@DenisErmolin,当然,但这不是线程。另外,分叉*请求*运行ffmpeg可能是一个非常糟糕的主意。 – rid
@DenisErmolin'pcntl_fork()'在Web请求的上下文中并不真正起作用,如果您退出主进程以返回响应,您将离开一个孤立的进程。如果你想做类似这样的事情,对exec('php /path/to/script.php>/dev/null 2>&1&')来说更好。 – DaveRandom
创建一个需要转换的视频队列,然后使用cron
作业逐个转换视频。这个队列可以存储在诸如消息队列或数据库之类的东西中。
使用数据库,你可以创建一个包含列ID
,StartDatetime
,EndDatetime
,Filename
,Status
,Owner
表,并适当设置这些当视频被上传。当某个用户请求他或她的任何视频的状态时,只需查看数据库中的状态,其中(例如)1 =已添加,2 =当前正在处理,3 =已完成,4 =错误。
现在您的cron作业开始处理所有项目,一个接一个,状态等于1;处理时将其更新为2,然后适当地更新为3或4。
通过所有叉/ EXEC /解决方案,在那里你立即开始处理上载的视频背景般的运行,你允许所有用户呛服务器。如果多个用户同时开始处理大型视频会怎么样?您无法控制单独的进程,并且它们都在同一时间运行,可能会严重降低服务器速度。
通过使用一个进程顺序处理项目(从cron
开始),您可以更好地管理正在使用的资源。
看起来像job server的工作。只需将其添加为background task
PHP不是以任何方式,形状或形式的多线程。你可以用一些方法假的,但他们不是真正的“主题”:
ignore_user_abort(TRUE)
允许一个脚本来保持甚至是用户断开连接后运行。exec()
可以火起来的,可以在后台运行shell级别一个新的进程,但是这将是一个完全独立的过程,而不是从父脚本控制,无需额外措施pcntl_fork()
将创建当前的克隆脚本,然后可以继续进行处理,但是名义上将独立于父脚本。这要求pcntl
扩展可用,并且在Web请求的上下文中使用不安全。
你可以产生ffmpeg作为后台进程。 请参阅详细说明here。
我建议将上传的视频文件保存到某处,然后在其上运行ffmpeg,并显示“处理文件..”,直到文件被创建(但您不会等待ffmpeg,只是检查它是否创建了文件)。
另一种选择是将文件放在某个目录中,比如/ videos。然后创建一个cron作业,它将监视/ videos文件夹并转换任何新文件。
当然,您可以考虑采用更复杂和更安全的方法。
我认为,人们通常会向Gearman的这些类型的任务:http://php.net/manual/en/book.gearman.php
- 1. 如何使用多线程的php curl?
- 2. 如何在线程中使用php pcntl_fork?
- 3. 如何在同一类中使用多线程Java多线程?
- 4. 如何在laravel中使用多线程?
- 5. 如何在Quartz.net中使用多线程
- 6. 如何在TCL中使用多线程?
- 7. 如何在wp7中使用多线程?
- 8. 如何在Java中使用多线程
- 9. 如何使用多线程
- 10. 如何使用多线程
- 11. 如何使用多线程
- 12. 如何使用多线程
- 13. 如何使用多线程来有效地使用多线程
- 14. 多线程在PHP
- 15. 多线程在PHP
- 16. Java多线程中如何使用CountDownLatch?
- 17. 用Drupal 7在php中多线程
- 18. 如何在多线程应用程序中使用aiopg池?
- 19. 如何在多线程应用程序中使用Timer
- 20. 如何在多线程应用程序中有效使用RestTemplate?
- 21. 如何在Clion中启用多线程?
- 22. 如何在C#中使用BackgroundWorker类使用多线程?
- 23. 如何在使用java的多线程中使用log4j?
- 24. 如何在后台使用多线程提升线程
- 25. 如何在android中为多个线程使用多个按钮?
- 26. 在STA线程中使用多线程COM对象线程
- 27. 在多线程程序中使用exprtk
- 28. 在多线程程序中使用pthread_mutex
- 29. 如何在多线程程序中使用Ollydbg?
- 30. 多线程PHP与多线程Python
你打算通知当视频转换完成的用户? – Manuel
PHP不是,从来没有,并且可能永远不会是多线程的。你最好的选择是'exec()'外部脚本来完成这项工作。 – DaveRandom