2009-12-16 2 views
3

주 서버에 session_start()에 문제가 있습니다. 처음으로 페이지를로드 할 때 요청을 완료하는 데 1 초도 걸리지 않습니다. 약 12-15 초 동안 기다린 다음 페이지를 새로 고침하면로드 시간이 동일 해집니다. 그러나 초기 로딩 후 3-5 초 후에 예를 들어 페이지를 새로 고치려고하면 서버 응답 시간이 10 초가됩니다.function session_start() 문제 (천천히 작동)

내 스크립트에서 병목 현상을 정의하기 위해 몇 가지 테스트를 수행했으며 그 함수는 session_start()이 9.8 초 동안 실행된다는 것을 알았습니다. PEAR 패키지 HTTP_Session2를 사용하고 있습니다. 그 문제는 HTTP_Session2::start() 기능에,

//First loading (13:34:35) 
HTTP_useCookies(1) -> 0.00038 
HTTP_start(2) -> 0.00077 
HTTP_setExpire(3) -> 0.00090 

// Second loading (13:34:39)(4 seconds later) 
HTTP_useCookies(1) -> 0.00029 
HTTP_start(2) -> <<<<<<10.80752>>>>> 
HTTP_setExpire(3) -> <<<<<<10.80780>>>>> 

//Third loading (13:34:56) 
HTTP_useCookies(1) -> 0.00041 
HTTP_start(2) -> 0.00071 
HTTP_setExpire(3) -> 0.00083 

그래서 내가 찾은 : 로그의

HTTP_Session2::useCookies(SESSION_USE_COOKIE); 
/* Next line was added to make logging of execution time possible. */ 
self::writeToFile('HTTP_useCookies(1) -> '.self::getWorkTime()); 
HTTP_Session2::start("SID"); 
self::writeToFile('HTTP_start(2) -> '.self::getWorkTime()); 
HTTP_Session2::setExpire(time() + SESSION_EXPIRE); 
self::writeToFile('HTTP_setExpire(3) -> '.self::getWorkTime()); 

텍스트 : 여기에 코드입니다. 함수 코드 HTTP_Session2::start() :

public function start($name = 'SessionID', $id = null) 
{ 
    self::name($name); 
    if (is_null(self::detectID())) { 
    if ($id) { 
     self::id($id); 
    } else { 
     self::id(uniqid(dechex(rand()))); 
    } 
    } 
    session_start(); 
    if (!isset($_SESSION['__HTTP_Session2_Info'])) { 
    $_SESSION['__HTTP_Session2_Info'] = self::STARTED; 
    } else { 
    $_SESSION['__HTTP_Session2_Info'] = self::CONTINUED; 
    } 
} 

무엇이 시간 지연의 원인인지 이해할 수 없습니다. 서버에 잘못된 Apache 설정이있을 수 있습니다. 또는 세션 정보가 포함 된 파일에 '잠금 장치'가 있습니다.

어쩌면 누군가가 이미 이러한 문제를 겪고 있으며이를 해결하는 데 도움이 될 수 있습니다.

+0

관련 http://stackoverflow.com/q/13772074/168034 – phunehehe

답변

10

PHP가 요청을 처리하는 동안 세션의 정보가 들어있는 파일이 잠겨 있습니다.

그래서 현재 실행중인 하나의 PHP 스크립트 (세션 사용)가 있고 동일한 사용자가 다른 요청을 보내면 두 번째 요청은 첫 번째 요청이 완료 될 때까지 대기합니다.

+0

다른 요청을 보내면 요청이 이미 완료되었습니다. – Alex

+0

저는 방금 서버에 더 많은 요청이 있다는 것을 알았습니다. 전체 페이지를로드 한 후 시작됩니다. 그래서 세션 파일은 정말로 잠겨 있었지만 어디에 정의 할 수 없었습니다. 그것이 내가 아파치 설정에 대해 생각한 이유이다. 고마워, 파스칼. – Alex

+0

파스칼 마틴 감사합니다, 그 때문에 큰 성능 문제가 발생했습니다. 그래서 file1.php에'session_start(); sleep (10);'두 번째 스크립트 file2.php를 실행하면 file1에서 잠자기까지 기다릴 것입니다. – adrianTNT