그러냐

php 스크립트가 서버에 백그라운드 프로세스(background process)를 낳는 방법 본문

php

php 스크립트가 서버에 백그라운드 프로세스(background process)를 낳는 방법

관절분리 2017. 7. 26. 20:32
반응형

원문은 http://www.fijiwebdesign.com/fiji-web-design-blog/create-a-background-process-on-the-server-with-php.html 에 있는겁니다. 오래전에 스크랩해둔건데, 써먹을만한 곳이 생각나서 꺼내왔습니다.

(제가 직접 구현한 건 아니고 같은 팀의 팀원이 구현했는데 .. 과정을 정리해본겁니다.)

시나리오는 대략 ...

  1. 유저가 html form으로 업로드한 csv formatted file을 해석해서 dbms의 테이블에 저장한다.
  2. csv는 최대 수천 레코드를 포함한다.
  3. csv의 항목 중 이미지 파일의 위치를 나타내는 url이 있는데, 이미지가 존재하는 경우 다운로드해서 저장한다.

처음에는 fgetcsv로 간단히 구현했습니다. 문제점이 많죠. 실행시간이 길어지면 곤란하기 때문에 수천개의 레코드를 처리하기 부담스럽습니다. 유저 입장에서도 업로드 후에 한참 기다려야 하고, 처리가 끝난다음 화면이 제대로 갱신되지 않거나 하면 불편하겠죠.

이걸 파이썬 셸 스크립트로 다시 작성을 하니 몇 가지 장점이 있더라고요. 우선 셸 스크립트로 실행되니까 메모리 문제가 조금 자유롭습니다. 그리고 파이썬쪽이 좀 더 빠르게 실행되는 것 같았고요. 그리고 일부 필드에 포함된 html을 제거해야 했는데 html의 strip_tags()는 <, > 사이에 있는 건 다 없애버리지만 파이썬엔 더 똑똑한 모듈이 있더군요.

하지만 문제가 다 해결된 건 아니지요. 여전히 php나 httpd의 timeout에 제약을 받고 특히 네트워크가 느리거나 하면 치명적입니다. timeout의 영향을 안 받기 위해서 서버에 데몬이나 cronjob을 걸어두는 방법을 생각했어요.

.... 번거롭죠.

데몬이 죽을 수도 있고, 이걸 도 감시하거나 해야하고 --; cron은 너무 자주 하기도, 띄엄띄엄 하기도 뭣하고 ...

파일 업로드가 다 되면 / 이걸 처리하는 프로세스를 만들어서 백그라운드로 돌린 다음에 / 서버스크립트 종료, 브라우저로 응답 전송 / 화면에 처리중이니 좀 이따가 확인해보라고 안내해주면 유저도 수긍한다. 이런 시나리오로 하면 누이좋고 매부좋은 시나리오라고 할만합니다.

이렇게 하기 위해 맨 위에 링크해둔 글에 나온 방법을 참고해보면....

리눅스 혹은 unix계열이면 간단해요.
exec()나 passthru() 같은걸로 스크립트를 실행할 때, 결과를 /dev/null로 redirect하고, &를 붙여서 백그라운드로 보내버리면 끝.

exec('import_csv.py > /dev/null &');

아니면 http response header를 이용하는 방법도 있네요. response header에 content-length를 짧게 줘서, 브라우저가 로딩을 멈추게 한다는 개념인데 ... 이건 맘에 안드는군요. 서버측에서의 timeout 문제는 여전히 남아있는거니까요.

그런데 IE는 response body가 최하 256바이트는 되어야 화면을 렌더링할 수 있다는 얘긴 좀 놀랍네요. 글이 오래전에 쓰여진거라 (2005년이나 그 이전) IE7같은데선 괜찮을 지도 모르지만요.


출처 : http://hardworker.tistory.com/17

반응형