2010-03-04 3 views
5

그래서 웹 서버를 만들고 "매우 큰"파일 업로드를 지원하고 싶다고합시다. 또한 표준 multipart/form-data MIME 형식을 통해이 작업을 수행한다고 가정합니다. 나는 erlang을 사용 중이며 erlang:decode_packet/2에서 반환 된 HTTP 패킷을 수집 할 계획이지만 HTTP 요청 처리기가 업로드 된 컨텐트를 찾을 때까지 실제로 요청 본문을 수집하고 싶지는 않습니다. 해야합니까?Erlang 웹 서버에서 매우 큰 파일 업로드를 처리하려면 어떻게해야합니까?

a) 메모리가 부족하여 서버가 매우 크고 서버가 손상 될 가능성을 무시하고 계속해서 본체를 수집하십시오.

b) 헤더가 처리 될 때까지 소켓에서 (존재하지 않을 수도있는) 요청 본문 수신을 자제 하시겠습니까?

c) 다른 작업을 수행 하시겠습니까?

않음 C의 예 수도 수 : 동시에 향후 처리를 위해 HTTP 요청 핸들러에 그 위치를 나타내는 반면, 수집 (메모리 사용을 최소화하기 위해) 임시 위치에 업로드 된 콘텐츠를 작성하기 위해 다른 프로세스를 생성. 그러나 나는 단지 모른다 - 여기에 표준 기술이 있는가?

+0

글쎄, 표준 방식은 내가 옵션 c에 대해 제안한 것을하는 것 같다. 그래도 나는 더 나은 방법이 있어야한다고 느낍니다. 임시 파일의 어색함에 귀찮습니다. 추가 지점을 열어야합니다 (어떤 시점에서 파일을 다시 읽으려는 경우 두 번 이상 열어야합니다). 그들은 두 개 이상의 프로세스 사이에서 하나씩 처리하고자하는 것을 나눕니다. 그러나 이것은 내가하고 싶은 일이었습니다. 나는 다른 누군가가 다른 방식으로 일을하고 있을지 모르겠다. – Aoriste

+0

데이터를 저장해야합니다. 실제로 이것은 메모리 나 저장 장치에서 이루어집니다. 귀하의 질문에 메모리가 옵션이 아니라고 말합니다; 귀하의 의견은 장치에 저장하는 것을 좋아하지 않는다고 말합니다. 유일하게 남은 옵션은 오컬 티즘입니다. – Zed

답변

2

제 생각에는 옵션 b가 분명히 우수합니다.

소켓을 읽지 않는 동안 TCP 코드는 계속 커널에 들어오는 데이터를 버퍼링합니다. 그렇게 할 때 결국 (TCP 수신 버퍼가 가득 차게 될 때까지) HTTP 서버에 작고 작은 TCP 창 크기를 알리면 TCP 창이 닫힙니다.

즉, 소켓을 읽지 않으면 TCP 흐름 제어가 해당 작업을 수행 할 수 있습니다.

+0

나는 비밀리에 b를하는 것에 대한 정당성을 찾고 있었고, 그것을 제공하는 데 도움을 주셔서 감사합니다. 필자는 코드 유지 관리에서 더 잘 이해하지만이 방법으로는 구현하기에 충분하지 않습니다. – Aoriste

0

제 생각에는 응답 C에 대한 예제가 있습니다 - 소켓 청크에서 청크로 읽고 청크를 임시 파일로 읽습니다. 또한 afaik yaw는 simillar 기법을 사용합니다. yaws/src/yaws_multipart.erl에서 볼 수 있습니다.

0

임시 파일에 저장하는 것은 PHP가하는 일이기도하므로 실제로 테스트를 거쳐야합니다. 받은 바이트 수를 세고 크기가 맞지 않으면 연결을 끊을 수 있습니다.

관련 문제