2009-10-08 4 views
2

저는 배치 파일 업로드 스크립트가 있습니다.이 스크립트는 비디오 파일을 디렉토리에 업로드합니다. 단순한. 업로드가 완료되면 해당 파일에 대한 mysql 레코드가 만들어지고 대기열의 다음 파일로 이동합니다.비디오 변환 프로세스를 백그라운드에서 "fork"하는 방법은 무엇입니까?

바로 전에, 업로드 된 avi avi 파일을 iPod 호환 가능한 mp4 파일로 변환하고 일부 미리보기 엄지 손가락을 생성하는 백그라운드 프로세스를 호출하고 싶습니다. 당신이 상상할 수 있듯이, 그것은 약간의 시간이 걸립니다 ...... 나는 단순히 파일 업 로더에 변환 코드를 넣을 수 있습니다 ... 그러나 좋은 파일은 10-20 분 정도 걸릴 것입니다. 이것은 nono (심지어 관리자 전용 기능).

그래서 백그라운드로 변환 프로세스를 포크하고 파일을 변환하는 동안 다음 업로드로 이동하려고합니다.

이런 일이 일어날까요, 아니면 실제로 php fork 함수를 사용해야합니까?

exec("/usr/bin/php ./convert.php?id=123 > /dev/null 2>&1 &"); 
+0

나는 과거에 이와 비슷한 것을 사용했다 : exec ('bash -c "/ usr/bin/php ./convert.php>/dev/null 2> & 1 &"'); 커맨드 라인에서 URL 인수를 전달하려고 시도하고 있습니다. 작동하지 않을 것이라고 확신합니다. 대신 커맨드 라인 인수로 전달해야합니다. –

+0

어떻게하면됩니까? –

답변

1

간부에 대한 PHP 매뉴얼 페이지()는 말한다 : 프로그램을 위해,이 기능을 시작

경우는, 백그라운드에서 실행의 출력 을 을 계속하기 위해 프로그램은 파일이나 다른 출력 스트림으로 리디렉션되어야합니다. 을 실행하지 않으면 PHP 실행이 이 될 때까지 멈추게됩니다.

그래, 네 임원 호출이 트릭을 할 것입니다.

1

아키텍처를 구현하는 가장 좋은 방법은 작업 대기열이며, PHP 프론트 엔드는 변환 할 백엔드 파일에 데몬을 제공합니다. PHP를 작업에서 분리하면 UI가 항상 반응 형으로 유지됩니다.

오랫동안 PHP를 작성하지는 않았지만 모든 프로세스가 최대 시간 초과 규칙 인 에 속하며 웹 서버에서 실행된다는 것을 알고 있습니다. 당신은 그런 경우가되고 싶지 않습니다. 당신은 확실히 추가 프로세스를 시작할 수있는 웹 요청을 원하지 않습니다.

웹 서버 외부에서 실행되고 업로드 된 파일을 위해 폴더를 감시하는 간단한 데몬을 작성하십시오. 웹 프론트 엔드가 거기에 덤프하고, 데몬은 얼마나 많은 코어가 있는지 각 변환에 대한 스레드를 생성합니다. 구조적으로 이것은 현명한 선택입니다.

관련 항목도 this question에 대한 제 응답을 참조하십시오.

+0

시간 초과 규칙은 ' 그는 실제로 활성 스크립트와 결합되지 않은 백그라운드 프로세스를 효과적으로 시작하고 있습니다. –

+0

PHP로 실행되는 자식은 없습니까? –

+0

하위 프로세스는 부모와 동일한 주소 공간에있는 하나의 프로세스를 의미하며 여기서는 그렇지 않습니다. 단지 새로운 프로세스를 생성합니다. –

0

트릭을 수행하지만 관리하기 어려운 아이디어처럼 보입니다. 너가 다만 발사하고 결코 되돌아 보지 않으면, 일은 진짜로 빨리 잘못 될지도 모르다.

몇 분 간격으로 실행되는 스크립트를 예약하고 대기열에있는 모든 것을 폴링하는 방법은 어떻습니까? cron에 액세스 할 수 있습니까?

+0

예 cron을 할 수는 있지만 ... 요청에 따라 실행을 요청하기 때문에 더 빠를 것 같습니다. –