저는 인터넷에서 비디오를 공유하는 것에 관한 웹 사이트를 개발 중입니다. 흐름은 다음과 같습니다 : 사용자가 비디오를 업로드합니다 -> 서버 측에서 비디오를 수신하고 ffmpeg를 사용하여 비디오 형식을 flv로 변환합니다 -> 사용자는 사이트에서 다른 일을 계속합니다. 이제 flv로 변환 된 비디오를 기다리지 않고 다른 일을 할 수 있도록 변환 작업 (ffmpeg를 사용하여 비디오 포맷을 flv로 변환)을 수행하는 다른 스레드를 만들고 싶습니다. 그러나 어떻게 모르겠다!PHP에서 멀티 스레딩을 사용하는 방법
답변
PHP는 스레드를 지원하지 않습니다. 이를 수행하기 위해 cron 스크립트로 실행되는 백그라운드 작업을 사용해야합니다.
예를 들어 디스크에 파일 이름, 상태 (보류 중, 변환 중, 준비 중) 등의 처리 할 작업이있는 테이블을 가질 수 있습니다. 그런 다음 스크립트가 모든 보류중인 작업을 가져 와서 상태를 변환하고 파일을 변환 한 다음 상태를 준비로 변경합니다. 이 방법으로 사용자에게 정보를 제공 할 수 있으며 동시에 두 개 이상의 파일을 변환하려는 경우 여러 개의 스크립트를 실행할 수 있습니다.
아니면 그는 PHP 프로세스 –
@DenisErmolin을 포크 할 수 있습니다. 물론, 스레딩이 아닙니다. 게다가 ffmpeg를 돌리는 * 요청 *을 포크하는 것은 아마도 매우 나쁜 생각입니다. – rid
@DenisErmolin'pcntl_fork()'는 웹 요청의 컨텍스트에서 실제로 작동하지 않습니다. 주 프로세스를 종료하고 응답을 반환하면 고아 프로세스가 종료됩니다. '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로 적절하게 업데이트됩니다. 모든 포크/간부/실행 -에 - 배경과 같은 즉시 업로드 된 동영상 처리를 시작 솔루션, 당신은 수있는 모든 사용자가
서버를 질식합니다. 여러 사용자가 동시에 큰 동영상을 처리하기 시작하면 어떻게 될까요? 별도의 프로세스를 제어 할 수 없으며 동시에 모든 프로세스가 동시에 실행되므로 서버 속도가 크게 느려질 수 있습니다.
항목을 하나의 프로세스 (cron
에서 시작)를 사용하여 순차적으로 처리하면 사용중인 리소스를보다 잘 관리 할 수 있습니다.
job server과 비슷한 모양입니다. background task
PHP는 어떤 식 으로든, 형태 또는 형태로 다중 스레드되지 않습니다. 당신은 몇 가지 방법과 가짜 수 있지만 "스레드"사실이 아니다 위치 :
ignore_user_abort(TRUE)
심지어 사용자의 연결을 끊 후 계속 실행하는 스크립트를 할 수 있습니다.exec()
는 백그라운드에서 실행 할 수있는 쉘 수준에서 새로운 프로세스를 불 수 있지만, 이것은 현재의 복제를 만듭니다 추가 조치pcntl_fork()
없이 부모 스크립트에서 제어 완전히 독립적 인 과정이 아닌 것입니다 스크립트는 처리와 함께 진행될 수 있지만, 다시 명목상 부모 스크립트와 독립적입니다. 이를 위해서는pcntl
확장자를 사용할 수 있어야하며 웹 요청과 관련하여 사용하기에 안전하지 않습니다.
ffmpeg를 백그라운드 프로세스로 생성 할 수 있습니다. 자세한 내용은 here을 참조하십시오.
업로드 된 비디오 파일을 어딘가에 저장 한 다음 ffmpeg를 실행하고 파일이 생성 될 때까지 "Processing file .."을 표시하는 것이 좋습니다 (그러나 ffmpeg를 기다리지는 않습니다. 파일).
또 다른 옵션은/videos와 같은 일부 디렉토리에 파일을 저장하는 것입니다. 그런 다음/videos 폴더를 모니터링하고 새 파일을 변환하는 cron 작업을 만듭니다.
물론 더 정교하고 오류가없는 방법을 생각해 볼 수 있습니다.
나는 사람들이 일반적으로 작업의 이러한 종류의 Gearman을 차례 생각 : http://php.net/manual/en/book.gearman.php
- 1. 멀티 스레딩을 사용하는 NSNotification XCODE
- 2. 멀티 스레딩을 사용하는 Net UDP
- 3. 콘솔에서 멀티 스레딩을 제어하는 방법
- 4. NSEnumerationConcurrent가 멀티 스레딩을 보장합니까?
- 5. 멀티 스레딩을 사용하는 공유 트랜잭션 팁
- 6. HTTPS 및 멀티 스레딩을 사용하는 컬 (curl)
- 7. Java에서 멀티 스레딩을 사용하는 프로듀서/소비자
- 8. 내 코드에서 멀티 프로세싱/멀티 스레딩을 사용하는 방법은 무엇입니까?
- 9. PHP5는 멀티 스레딩을 지원합니까?
- 10. DBCP - 멀티 스레딩을 지원합니까?
- 11. Webservice에서 멀티 스레딩을 지원합니까?
- 12. IPhone에서 NSThread에서 정적 메서드로 멀티 스레딩을 사용하는 방법
- 13. iOS : 멀티 스레딩을 구성하는 가장 좋은 방법
- 14. 비동기 프로그래밍은 멀티 스레딩을 의미합니까?
- 15. Java에서 멀티 스레딩을 어떻게 처리해야합니까?
- 16. VB.NET은 자체적으로 멀티 스레딩을 수행합니까?
- 17. C# 멀티 스레딩을 사용하여 파일을 처리하는 방법
- 18. 멀티 스레딩을 사용할 때 메서드를 잠그는 방법?
- 19. iOS에서 evernote api로 멀티 스레딩을 처리하는 방법
- 20. Python 멀티 스레딩을 통한 성능 향상 방법
- 21. 멀티 스레딩을 통한 다운로드 처리량 극대화 방법
- 22. Azure에서 멀티 스레딩을 수행하는 올바른 방법
- 23. PHP에서 멀티 스레딩
- 24. 멀티 스레딩을 통한 애플리케이션 리던던시
- 25. 멀티 스레딩을 사용하여 합계 계산
- 26. TCL에서 멀티 스레딩을 사용하려면 어떻게해야합니까?
- 27. .net 플랫폼에서 프로듀서 소비자와 멀티 스레딩을 사용하는 프로세서 코어 사용
- 28. 간단한 WPF 응용 프로그램에서 멀티 스레딩을 사용하는 경우의 문제
- 29. OpenMP 멀티 스레딩을 사용하는 Stl 컨테이너 벡터 push_back
- 30. 내 코드가 멀티 스레딩을 사용하는 데 필요한 이야기의 징조는 무엇입니까?
당신이 비디오를 변환 할 때의 사용자에게 통지 하시겠습니까? – Manuel
PHP는 결코 존재하지 않았으며, 결코 존재하지 않았을 것이며, 멀티 스레드 될 가능성은 거의 없습니다. 가장 좋은 방법은 작업을 수행하기위한 외부 스크립트를'exec()'하는 것입니다. – DaveRandom