2014-03-13 6 views
1

사용자 당 프로세스를 생성해야하는 웹 응용 프로그램을 개발 중입니다. 특정 페이지로 이동할 때 수행됩니다. 로그온하는 각 사용자에 대한 PHP 프로세스

<?php 
session_start(); 
while($_SESSION['continue']) { 
// Do some processing 
session_write_close(); 
sleep(30); 
session_start(); 
} 
exit(); 

사용자가 페이지에서 멀리 탐색

하면 '계속 :이처럼 (다음 앉아있는 데이터베이스/세션에서 데이터 항목을 읽고) PHP 스크립트를 호출하고 절전 모드로 전환 Ajax 호출이 '세션 변수가 false로 설정되고 위의 PHP 프로세스가 종료됩니다.

수행중인 처리가 중요하지 않습니다. 데이터베이스에서 몇 가지 레코드를 읽고 일종의 검사를합니다.

질문 : 좋은 생각입니까? 많은 사용자가 온라인 상태 일 때 명백한 메모리 문제가 발생합니까?

많은 감사, Arvy

+1

표준 아파치 하위는 한 번에 하나의 요청 만 처리 할 수 ​​있습니다. 100 명의 자녀를 허용하는 경우 사이트의 MOST 사용자 99 명 중 1 명이 한 페이지를 적극적으로로드하고 99 명의 자녀가 do-not-very-much 루프를 실행합니다. 그리고 100 번째 자식이 루프를 실행하기 시작하면 효과적으로 사이트의 모든 사람을 차단합니다. 이제 계속 변수를 변경할 수 없으며 사이트가 종료되었습니다. –

+0

물론, 스크립트가 max_execution_time에 도달하고 Apache에 의해 죽기를 바랍니다.하지만 그 동안에는 아무 일도 일어나지 않을 것입니다. –

+0

@MarcB 자물쇠를 막기 위해 아이들을 더 높게 설정하고 현재 수를 확인하는 방법을 살펴 보겠습니다. 제한 시간 제한을 수동으로 설정했습니다.이 제한 시간은 상당히 높지만 수행하고 싶은 시간에 필요합니다. 그래서 당신이 말했듯이 결국 그것은 밖으로 걷어차지만, 시간이 좀 걸릴 것입니다! 귀하의 의견에 감사드립니다. – arvy3

답변

1

난 당신이 목표는 궁극적하는지 정말 모르겠어요,하지만 sleep 스크립트의 병목이 어디해야 비 차단 이상적이다. 다른 모든 작업이 빠르면 CPU에 대해 걱정할 필요가 없습니다.

그러나 각 요청은 프로세스를 테이블에 추가하고 프로세스가 종료되지 않거나 거의 종료되지 않으므로 프로세스 테이블이 가득 차고 결국 더 이상의 요청을 처리 할 수 ​​없으므로 결국 요청을 처리 할 수 ​​없습니다. 좋은 아이디어.

대신 각 요청에 대한 처리를 수행하는 것이 좋습니다. 사용자가 매 30 초마다 요청할 것으로 기대합니다. 또 다른 가능한 대안은 cron 작업을 사용하여 매분마다 실행되고 로그인 된 사용자에 대해 작동하거나 사용자가 로그인 할 때 사용자가 일정에 따라 로그인 한 사용자를 처리하는 신호를 보낼 수있는 다른 데몬을 사용하는 것입니다.

+0

감사 폭발 알약. 흥미로운 점은 로그온 한 사용자를 통해 작업 루프를 수행하고 처리하는 아이디어가 마음에 들었습니다. 조금 더 살펴볼 것입니다. 고마워. – arvy3

+0

이것은 나를 많이 도왔다 !! 나는 각 개별 사용자를 위해 모니터를 설치하려고 너무 많은 시간을 낭비했다는 것을 믿을 수 없다. 나는 이제 이와 같은 것을 구현할 것이다 : active_users 테이블과 PHP 스크립트는 테이블을 거쳐 변경 사항을 처리한다. 완전한! 다시 한번 감사드립니다. – arvy3

1

나는 이것이 여러 가지 이유로 좋지 않다고 말할 것이다.

우선, 아파치에서 실행중인 경우, 요청 당 하나의 프로세스를 사용하기 때문에 아파치 프로세스가 부족합니다. 스크립트는 끝내기까지 매우 오랜 시간이 걸리는 요청이므로 로그인 한 각 사용자가 사용할 수있는 프로세스가 적어짐에 따라 점차적으로 눈에 띄는 속도 저하를 겪은 다음 완전한 잠금이 발생하게됩니다.

DoS/DDoS 세션을 유지하는 침입자가 귀하의 웹 사이트/서버에 치명적인 영향을 미칠 수있는 공격자가 있음을 발견 한 경우에도이를 남용하는 것은 매우 쉽습니다.

클라이언트의 데이터를 계속 출력하지 않으려는 경우가 아니면 사용자의 브라우저 속도는 느려지지만 완전히 처리되지는 않습니다. 이는 좋은 아이디어는 아닙니다. . AJAX는 제어하려는 고통이 적기 때문에 더 많은 양의 끌어 오기 요청을 사용하는 경향이 있으며 브라우저에 대한 요구가 많지 않습니다.

당신이 이걸로 가고, 내가하지 말라고 조언한다면 어쨌든 스크립트 시작 부분에 set_time_limit(0);이 필요하다. 왜냐하면 코드가 PHP에 의해 자동으로 죽을 것이기 때문이다.

대안을 제안하려면 AJAX가 브라우저에 주기적으로 요청하십시오 (예 : 원하는대로 30 초). PHP 스크립트는 30 초마다 호출되며 처리 시간은 최소화하면서 처리 할 수 ​​있습니다.

귀하의 웹 사이트에 대해 온라인 상태 인 최종 사용자 활동 통계/사용자 정보로 가정합니다.Facebook과 같은 웹 사이트에서 어떻게하는지 살펴보면 브라우저가 '끌어 오기'요청을 서버로 계속 보내고 서버는 새로운 알림, 메시지, 온라인 사용자 목록, 뉴스 피드 항목 등과 같은 정보를 보냅니다. 등등.

+0

DoS 문제에 대한 좋은 지적. 전에 그것에 대해 생각 했어야 했어! 나는 이제 그 과정을 클라이언트와 독립적으로 만들었다. 로그온 한 사용자를 처리하는 프로세스도 하나뿐입니다. 귀하의 통찰력에 감사드립니다. – arvy3

관련 문제