2012-05-07 5 views
4

저는 인터넷에서 비디오를 공유하는 것에 관한 웹 사이트를 개발 중입니다. 흐름은 다음과 같습니다 : 사용자가 비디오를 업로드합니다 -> 서버 측에서 비디오를 수신하고 ffmpeg를 사용하여 비디오 형식을 flv로 변환합니다 -> 사용자는 사이트에서 다른 일을 계속합니다. 이제 flv로 변환 된 비디오를 기다리지 않고 다른 일을 할 수 있도록 변환 작업 (ffmpeg를 사용하여 비디오 포맷을 flv로 변환)을 수행하는 다른 스레드를 만들고 싶습니다. 그러나 어떻게 모르겠다!PHP에서 멀티 스레딩을 사용하는 방법

+0

당신이 비디오를 변환 할 때의 사용자에게 통지 하시겠습니까? – Manuel

+2

PHP는 결코 존재하지 않았으며, 결코 존재하지 않았을 것이며, 멀티 스레드 될 가능성은 거의 없습니다. 가장 좋은 방법은 작업을 수행하기위한 외부 스크립트를'exec()'하는 것입니다. – DaveRandom

답변

6

PHP는 스레드를 지원하지 않습니다. 이를 수행하기 위해 cron 스크립트로 실행되는 백그라운드 작업을 사용해야합니다.

예를 들어 디스크에 파일 이름, 상태 (보류 중, 변환 중, 준비 중) 등의 처리 할 작업이있는 테이블을 가질 수 있습니다. 그런 다음 스크립트가 모든 보류중인 작업을 가져 와서 상태를 변환하고 파일을 변환 한 다음 상태를 준비로 변경합니다. 이 방법으로 사용자에게 정보를 제공 할 수 있으며 동시에 두 개 이상의 파일을 변환하려는 경우 여러 개의 스크립트를 실행할 수 있습니다.

+0

아니면 그는 PHP 프로세스 –

+0

@DenisErmolin을 포크 할 수 있습니다. 물론, 스레딩이 아닙니다. 게다가 ffmpeg를 돌리는 * 요청 *을 포크하는 것은 아마도 매우 나쁜 생각입니다. – rid

+2

@DenisErmolin'pcntl_fork()'는 웹 요청의 컨텍스트에서 실제로 작동하지 않습니다. 주 프로세스를 종료하고 응답을 반환하면 고아 프로세스가 종료됩니다. 'exec ('php /path/to/script.php>/dev/null 2> & 1 &')'와 같이하면된다. – DaveRandom

2

변환해야 할 비디오 큐를 만들고, 예를 들어 cron 작업을 사용하여 비디오를 하나씩 변환하십시오. 이 대기열은 메시지 대기열 또는 데이터베이스와 같은 것으로 저장 될 수 있습니다. 데이터베이스는 열 ID, StartDatetime, EndDatetime, Filename, Status, Owner를 포함하는 테이블을 작성하고 동영상을 업로드 할 때 적절하게 사람들을 설정할 수 있습니다 사용

. 일부 사용자가 자신의 동영상 상태를 요청하면 데이터베이스에서 상태를 조회합니다 (예 : 1 = 추가, 2 = 현재 처리, 3 = 완료, 4 = 오류).

이제 cron 작업은 상태가 1 인 모든 항목을 하나씩 처리하기 시작합니다. 처리 할 때 2로, 이후에는 3 또는 4로 적절하게 업데이트됩니다. 모든 포크/간부/실행 -에 - 배경과 같은 즉시 업로드 된 동영상 처리를 시작 솔루션, 당신은 수있는 모든 사용자가


서버를 질식합니다. 여러 사용자가 동시에 큰 동영상을 처리하기 시작하면 어떻게 될까요? 별도의 프로세스를 제어 할 수 없으며 동시에 모든 프로세스가 동시에 실행되므로 서버 속도가 크게 느려질 수 있습니다.

항목을 하나의 프로세스 (cron에서 시작)를 사용하여 순차적으로 처리하면 사용중인 리소스를보다 잘 관리 할 수 ​​있습니다.

1

PHP는 어떤 식 으로든, 형태 또는 형태로 다중 스레드되지 않습니다. 당신은 몇 가지 방법과 가짜 수 있지만 "스레드"사실이 아니다 위치 :

  1. ignore_user_abort(TRUE) 심지어 사용자의 연결을 끊 후 계속 실행하는 스크립트를 할 수 있습니다.
  2. exec()는 백그라운드에서 실행 할 수있는 쉘 수준에서 새로운 프로세스를 불 수 있지만, 이것은 현재의 복제를 만듭니다 추가 조치
  3. pcntl_fork()없이 부모 스크립트에서 제어 완전히 독립적 인 과정이 아닌 것입니다 스크립트는 처리와 함께 진행될 수 있지만, 다시 명목상 부모 스크립트와 독립적입니다. 이를 위해서는 pcntl 확장자를 사용할 수 있어야하며 웹 요청과 관련하여 사용하기에 안전하지 않습니다.
0

ffmpeg를 백그라운드 프로세스로 생성 할 수 있습니다. 자세한 내용은 here을 참조하십시오.

업로드 된 비디오 파일을 어딘가에 저장 한 다음 ffmpeg를 실행하고 파일이 생성 될 때까지 "Processing file .."을 표시하는 것이 좋습니다 (그러나 ffmpeg를 기다리지는 않습니다. 파일).

또 다른 옵션은/videos와 같은 일부 디렉토리에 파일을 저장하는 것입니다. 그런 다음/videos 폴더를 모니터링하고 새 파일을 변환하는 cron 작업을 만듭니다.

물론 더 정교하고 오류가없는 방법을 생각해 볼 수 있습니다.

관련 문제