2016-09-04 11 views
1

타사 소스에서 사용자 특정 데이터를 가져오고 로컬 테이블에 덤프하는 PHP 스크립트가 있습니다.이 테이블은 사용자가 로그인 할 때마다 X 분마다 실행하려고하지만 실행하는데 약 30 초가 걸리며, 사용자가 경험하기를 원하지 않습니다. 이 작업을 수행하는 가장 좋은 방법은 각각의 성공적인 풀 타임 스탬프를 작성한 다음 마지막 푸시를 확인하는 모든 페이지 바닥 글에 코드를 배치하고 X 분 전 이상이면 백그라운드에서 PHP 스크립트를 실행하는 것입니다.백그라운드 프로세스를 실행하는 PHP 페이지

풀 스크립트를 실행할 때 필요한 사용자에 대한 전역 변수와 세션 변수가 있으므로 cron 작업을 사용하지 않으려합니다.

popen()을 사용하면 PHP 스크립트를 실행할 수 있지만이 스크립트가 세션 내에서 방문자로 실행되는지 여부와 관련된 정보를 찾을 수없는 것으로 나타났습니다. 사용자 별 글로벌 또는 세션 변수) 또는 별도의 세션으로 구성됩니다.

  1. popen()이 내 문제를 해결합니까?
  2. 나는 올바른 방향으로 가고 있는가, 아니면 사용자가 로그인 한 상태에서 일정 간격으로 스크립트를 실행하는 더 좋은 방법이 있습니까?

언제나처럼 많은 도움이나 조언을 부탁드립니다.

건배

앤디

+0

별도의 프로세스는 항상 별도의 세션입니다. 스크립트에서 세션을로드하는 것이 더 쉬우 며 (코드에 완전히 의존하고 세션을 관리하는 방법) 프로세스에 대한 인수로 정보가있는 JSON (또는 직렬화 된 배열)을 전달하는 것이 더 쉽습니다. –

+0

사용자가 로그인 할 때마다이 코드를 X 분마다 실행해야하는 이유는 무엇입니까? 코드는 무엇을합니까? – Sherif

답변

0

나는 프론트 엔드에서 스크립트를 호출하고 결과를 처리하기 위해 자바 스크립트와 AJAX 요청을 사용합니다. 그런 다음 JavaScript에서 간격을 설정하고 각 간격 틱에서 AJAX 요청을 보낼 수 있습니다.

+1

파일을 사용하는 표준 세션 핸들러를 사용하는 경우 ajax 호출이 완료 될 때까지 대기해야하므로 새 요청을 할 수 없습니다. ajax 호출은 세션 파일을 잠그고 있으므로 새로운 요청은 액세스 할 수 없으므로 중단됩니다. – MarcHoH

+0

이것은 동시에 요청할 때만 적용됩니다. –

2

아마도 세션 데이터를 테이블에 넣는 아이디어 일 수도 있습니다. 그런 식으로 백그라운드 프로세스에서 쉽게 액세스 할 수 있습니다. 프로세스가 현재 처리중인 사용자를 알 수 있도록 session_id() 또는 user id을 인수로 전달하면됩니다. http://api.jquery.com/jquery.ajax/

사용 방법 "성공은"그 30 초 후에 뭔가를 :

0

AJAX 당신이 필요합니다.

2
  1. 아니, PHP는 여전히 아마
  2. 하지를 종료하기 전에 솔루션은 시스템

의 건축 제한에 적합하지 않기 때문에, popen()에 의해 시작하는 과정에서 대기해야하기 때문에 귀하의 cron 작업을 사용하지 않는 것에 대한 추론은 사실 소리가 아닙니다. 그 특정 경로를 너무 빨리 탐험하는 것을 포기하고 둥근 구멍에 사각형 못을 끼워서 구석에 빠져 들었을 수도 있습니다.

실제 문제는 웹 요청과 crontab에서 실행중인 PHP 사이의 프로세스 간 통신을 수행하는 방법을 알아내는 것입니다. 이것은 여러 가지 방법으로 해결 될 수 있으며, PHP의 아키텍처 제약에 맞서보다 쉽게 ​​작업 할 수 있습니다.

예를 들어 데이터베이스 나 다른 저장소에 세션 ID를 저장하고 crontab에서 실행중인 PHP 스크립트의 세션 파일에 웹 요청과 독립적으로 액세스 할 수 있습니다.

사용자 테이블의 현재 세션 ID와 함께이 정보를 일부 데이터 저장소에 타임 스탬프로 저장하여 사용자가 서버에 마지막으로 요청한 것을 기반으로 사용자가 로그인했다고 가정 해 봅시다.

cron 작업은 매 X 분마다 시작할 수 있습니다. 주어진 범위 내에서 활성 시간 소인이있는 레코드를 데이터베이스 또는 지속성 저장소에서보고 세션 ID를 가져와 필요한 작업을 수행하십시오.

이제 처리 시간이 30 초 이상 걸리면 실제로 어떻게 효과적으로 스케일을 조정할 수 있는가에 대한 질문은 독립적으로 해결할 수 있습니다. See this answer for more details on how to deal with distributed job managers/queues from PHP.

관련 문제