2011-02-18 7 views
1

나는 현재 5k 명의 사용자를 보유하고 있으며 앞으로도 계속 증가 할 PHP 응용 프로그램을 보유하고 있습니다. 일주일에 한 번 나는 스크립트 실행 메시지 대기열을 사용해야합니까?

  • 가 사용자를 통해 데이터베이스에서
  • 루프를 모든 사용자를 가져, 그리고 각각에 대한 일부 보수 (이 새로운 DB의 레코드를 추가 포함)
을 수행

이 스크립트가 마지막으로 실행 된 시간은 30 초의 최대 실행 시간 오류로 인해 죽기 전에 1400 명의 사용자 만 처리했습니다. 내가 생각한 한가지 해결책은 메인 스크립트가 여전히 모든 사용자를 가져 오도록하는 것이지만 유지 보수 프로세스 자체를 수행하는 대신 비동기식 cURL 호출 (각 사용자마다 1 회)을 수행하여 새 스크립트로 유지 보수를 수행합니다 특정 사용자.

5k + cURL 호출로 인해 서버가 다운 될 수 있다는 점이 걱정입니다. cURL 호출 대신 메시징 큐를 사용하여이를 해결할 수 있습니까? 나는 하나의 경험을 가지고 있지만 그것을 읽은 것에서 이것이 도움이 될 것 같은 것 같습니다. 그렇다면 어떤 메시지 대기열 시스템을 권하고 싶습니까?

어떤 배경 정보 :

  • 이 내 DB로 내 ORM와 MySQL로 교리를 사용 심포니 프로젝트,
  • 서버가 Windows 시스템, 그리고 내가 윈도우 작업 스케줄러를 사용하고 있는데 주당 한 번이 스크립트를 자동으로 실행하는 wget.

모든 조언과 도움을 주실 수 있습니다.

답변

2

가능한 경우 더 자주 실행되는 예약 된 작업 (크론 작업)을 만들고 LIMIT 100 (또는 다른 숫자)을 사용하여 한 번에 제한된 수의 사용자를 처리합니다.

0

각 사용자를 처리 할 때 논리를 변경하여 변경 사항을 적용 해 보았습니까? 모든 사용자를 처리하기 위해 단일 트랜잭션을 실행하는 것처럼 들릴 수도 있지만 이는 필요하지 않을 수 있습니다.

+0

모든 사용자를 반복하면서 각각 하나씩 별도의 SQL 쿼리를 사용하여 DB 레코드를 저장합니다. 이것은 '각 사용자를 처리 할 때 변경 사항을 적용'한다는 의미입니까? –

0

PHP의 실행 시간 제한을 늘리면 어떨까요?

더 빨리 유지 관리 절차를 개선 할 수 있는지 살펴 보는 것도 도움이 될 수 있습니다. 정확히 무엇을하고 있는지에 따라 약간 펼쳐 보일 수도 있습니다. 한 번에 모든 사람이 아니라 한 두 번 한 번하십시오. 그러나 당신이 정확히 무엇을하고 있는지에 달려 있습니다.

1

왜 cURL 아이디어를 사용하지 않고 각 사용자에 대해 하나의 사용자 만 처리하는 대신 1000 명 또는 그 이상의 그룹으로 사용자를 묶어서 여러 명의 사용자를 보내십시오.

2

몇 가지 아이디어 :

  1. 은 스크립트 실행 시간 제한 증가 - set_time_limit()
    배 밖으로 가지 말라, 그러나 30 초 이상은 시작이 될 것입니다.

  2. 은 아마 해당 사용자에 대해 수행 마지막으로 성공한 "보수"조치의 날짜/시간 설정이 필드를 각 사용자에 대해 last_check을 필드를 추가하고이 사용자에 대해 추적 보수.
  3. 더 작은 배치 처리
    더 작은 배치를 더 자주 실행하는 것이 좋습니다. PHP를 "하나 이상의 바구니에있는 모든 달걀"로 생각하십시오. 위의 last_check 필드를 사용하면 마지막 업데이트 이후 가장 긴 기간의 사용자를 쉽게 식별 할 수 있으며 처리주기에 대한 임계 값도 설정할 수 있습니다.
  4. 실행이 더 자주
    cronjob에 및 프로세스를 설정, (100)는 2 분마다 또는 그런 일을 기록 말한다.
  5. 성능 로그 및 검토
    로그 파일 및 기록 통계가 있습니다. 얼마나 많은 레코드가 처리되었는지, 마지막으로 처리 된 이후의 기간, 스크립트가 가져온 시간. 이러한 측정 기준을 통해 배치 크기, cronjob 설정, 시간 제한 등을 조정하여 최대 검사가 안정된 방식으로 수행되도록 할 수 있습니다.

이 모든 것을 설정하면 단일 프로세스에 비해 많은 작업이 가능하지만 사용자 볼륨을 늘릴 수 있으며 더 많은 유지 관리 작업을 수행 할 수있는 기반이됩니다. 선로.

관련 문제