2011-01-19 4 views
2

저는 현재 Linux 기반 VPS를 실행 중이며 768MB의 RAM이 있습니다.이 PHP 스크립트가 서버를 멈추게하는 것을 피하려면 어떻게해야합니까?

도메인의 세부 정보를 수집 한 다음 cURL을 통해 서비스에 연결하여 이러한 도메인의 PageRank에 대한 세부 정보를 검색하는 응용 프로그램이 있습니다.

약 50 개의 도메인에 대한 검사를 실행하면 스크립트가 세부 정보를 구문 분석하고 스크립트에 반환하기 전에 모든 결과가로드되는 데 약 3 분이 소요되는 원격 페이지가 필요합니다. 스크립트가 실행을 마칠 때까지는 아무 것도 작동하지 않는 것처럼 보이므로 사이트의 사용자는 페이지가로드 될 때까지 기다리는 동안 타이머/'죽음의 공'을 얻습니다.

** (원격 페이지는 도메인 정보를 검색하고 AJAX로 페이지를 업데이트하지만 로딩이 완료 될 때까지 컬 요청 나던 (정당) 페이지를 반환합니다.

내가 뭘하면 사람이 말해 줄 수 분명히 잘못되었거나 더 나은 방법이있는 경우 (대기중인 10 개에서 10,000 개의 도메인이있을 수 있으므로 나머지 사이트에는 영향을주지 않고 백그라운드에서 실행할 수있는 프로세스가 필요함)

감사합니다

+0

"아무 것도 작동하지 않는 것 같습니다." php 또는 모든 url (예 : 이미지)으로 파싱 된 다른 URL? – goat

+0

그냥 명확하게 – thatguy

+0

1) 다른 아무것도 작동하지 않는 것 같아요 PHP로 구문 분석 된 URL을 의미합니다. 이미지가 문제없이로드됩니다. – thatguy

답변

3

더 현명한 접근 방법은 cron 트리거 된 PHP cli 스크립트를 사용하여 도메인 데이터를 "일괄 처리"하는 것입니다. 이와 같이

당신이 데이터베이스 테이블에 관련 도메인을 삽입 더라면 플래그가 false로 설정 "처리 된"는 백그라운드 스크립트는 다음과 같습니다

  1. 은 때로 믿을 도메인 데이터베이스를 스캔 ' 처리 된 것으로 표시된.

  2. 컬 룩업을 수행

  3. 데이터베이스 레코드 따라서 업데이트 가공으로 표시.

    ...

기존 실행 일괄 처리 스크립트와 겹치지 없도록하려면, 당신은 단지 PHP 스크립트를 크론에서 5 분마다 호출해야하고 (PHP 스크립트 자체 내에서) 확인 얼마나 오래 스크립트는 "스캔"단계의 시작에서 실행 중이며 4 분 이상 실행 된 경우 종료됩니다. (이 수치를 조정하고 싶을 지 모르지만 이걸 가지고 어디로 가는지 알 수 있기를 바랍니다.)

이 방법을 사용하면 백그라운드 스크립트를 무기한으로 실행할 수 있습니다 (cron 재부팅 후 자동으로 시작됩니다.) 등의 작업을 수행하고 별도의 웹 프런트 엔드를 통해 도메인을 데이터베이스에 추가하거나 처리 결과를 검토하는 등의 작업을 수행합니다.

+0

Thanks Middaparka 나는 이미 위에서 설명한 것처럼 mysql DB에서 프로세스를 일괄 적으로 처리하고있다. 문제는 처리되지 않은 도메인을 선택하여 50을 확인하기 시작하면 프로세스가 완료 될 때까지 사이트에 페이지를로드 할 수 없습니다. – thatguy

+0

@thatguy 당신의 VPS 인스턴스가 리소스 뚜껑을 치고있을 수도 있습니다. (768Mb의 RAM을 가질 수도 있지만, CPU 사용량 등은 어떻게됩니까?) 배치를 시도하는 도메인의 수를 줄이면 아무런 차이가 없나요? (즉, 문제 또는 지속 시간을 초래하는 처리 부하 일뿐입니까?) –

+0

안녕하십니까, 그게 맞습니다. 도메인의 수는 스크립트가 실행하는 데 걸리는 시간에 영향을 미치지 만 '멈춤'을 유발하는 처리로드입니다. 나는 % memory (0.9)와 % cpu (0.2)를보고있어 과도한 것처럼 보이지 않는다. 임시적인 '충돌'이 발생하는 시점에 동일한 vps의 다른 사이트가 다른 이름으로 작동하는 것으로 나타났습니다 – thatguy

-1

코드가 어떻게 구성되어 있는지 잘 모르겠으나 sleep()을 사용해 볼 수 있습니다. 모자는 일괄 처리를 할 때 사용합니다.

0

이것은 이상적인 솔루션은 아니지만 사용자 요청에 따라이 프로세스를 트리거해야하는 경우 스크립트 끝에 다음을 추가 할 수 있습니다.

set_time_limit(0); 
flush(); 

이렇게하면 PHP 스크립트가 계속 실행될 수 있지만 결과는 사용자에게 반환됩니다. 그러나 진지하게, 배치 처리를 사용해야합니다. 그것은 당신에게 무슨 일이 일어나고 있는지 훨씬 더 많은 통제권을 줄 것입니다.

0

첫째로 미안하지만 나는 바보입니다! :)

사이트를 다른 브라우저 (FF)에로드 했으므로로드가 잘됩니다.

Chrome은 서버 응답을 기다리고있을 때 도메인에 잠금 장치를 사용하고 브라우저를 통해 스크립트를 수동으로 테스트했습니다.

귀하의 모든 도움에 감사 드리며 시간을 낭비하게되어 죄송합니다.

CJ

+0

기괴함. 아직도, 너는 살고 배운다. :-) 덧붙여서, 나는 대답으로 그것을 덧붙이 기보다는 위의 정보로 당신의 질문을 갱신 할 것이다. (그렇지 않으면 사람들은주의를 끌 가능성이 훨씬 적습니다.) –

0

난 당신이 더 제어 된 방식으로, 웹 서버의 외부에서 이러한 작업을 처리하는 고려해야 할 다른 사람들과 동의하는 동안, 나는 "서버 정지"에 대한 설명을 제공합니다.

네이티브 PHP 세션을 사용하는 경우 php는 배타적 잠금 방식을 사용하므로 한 번에 하나의 PHP 프로세스 만 주어진 세션 ID를 처리 할 수 ​​있습니다. 세션을 사용하는 오랫동안 실행 PHP 스크립트를 갖는 것은 확실히 이것을 일으킬 수 있습니다. 나는 그것 여기에 여러 번 논의 된 확신
PHP 세션 동시성 잠금 session_write_close()

:

당신은 같은 용어의 조합을 검색 할 수 있습니다. 너를 찾아내는 게 너무 게으른거야. 어쩌면 다른 사람이 와서 stackleflow 명성에 대한 대가로 글 머리 기호 목록 및 예쁜 하이퍼 링크와 답변을 만들 것입니다 :)하지만 나 :

행운을 빕니다.

관련 문제