2013-03-09 2 views
1

몇 달 동안 사이트에서 고유 세션을 추적하는 데 문제없이 다음 코드를 사용했지만 최근에 알려지지 않은 이유로 작동을 멈췄습니다. 별도의 파일에서 코드를 테스트하면 원래 의도 한대로 작동합니다.세션이 예상대로 작동하지 않습니다.

코드는 세션이 존재하는지 확인하고, 존재하지 않으면 세션을 만들고이를 TRUE로 설정합니다. 그런 다음 두 번째 검사를 수행하여 세션이 TRUE인지 여부를 확인한 다음 FALSE로 변경되고 데이터베이스에 저장된 조회가 변경됩니다. 이것은 세션 당 한 번 발생합니다. 이를 달성하기

코드는 다음과 같습니다

<?php 

session_start(); 

// If the session DOES NOT EXIST, make it and set it to TRUE. 
if(!isset($_SESSION['new_visit'])) 
{ 
    $_SESSION['new_visit'] = true; 
} 

// If the session is TRUE, make it false. 
if($_SESSION['new_visit'] == true) 
{  
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 

    $_SESSION['new_visit'] = false; 
} 

echo $_SESSION['unique_session_id']; 

이 코드를 실행하면 예상대로, 아무리 내가 페이지를 새로 고침 횟수, 출력이 변경되지 않습니다. 각 if 문은 한 번만 실행되므로 'unique_session_id' 변수는 항상 변경되지 않습니다. 그러나 제 제작 코드에는이 정확한 코드가 들어 있지만 갑자기 작동을 멈췄습니다. 내 생산 코드는 이것이다 :

<?php 

if(empty($article_data)) 
{ 
    $no_article = true; 
} 

$options  = $this->db->get_options(); 
$server_options = $this->db->server_options(); 

// Check site status (on/off). 
if($options['status'] == "off") 
{ 
    echo $options['offline_message']; 

    exit(); // Equal to die. 
} 

if($server_options['force_ssl'] == "on") 
{ 
    if($_SERVER["HTTPS"] != "on") 
    { 
     header("HTTP/1.1 301 Moved Permanently"); 
     exit(header("Location: https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"])); 
    } 
} 

$this->db->store_hit(); 
$this->db->store_ip(); 

//---------------------------------------------------------------------------------------------------------- 
// Store visits (individual sessions). Visits are not unique hits. Visits are the number of unique sessions, 
// so a single person may accumulate many visits (sessions), i.e., returning users. 
//---------------------------------------------------------------------------------------------------------- 

// If the session DOES NOT EXIST, make it and set it to TRUE. 
if(!isset($_SESSION['new_visit'])) 
{ 
    $_SESSION['new_visit'] = true;  
} 

// If the session is TRUE, make it false. 
if($_SESSION['new_visit'] == true) 
{ 
    $this->db->store_visit(); 

    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 

    $_SESSION['new_visit'] = false; 
} 

?><!DOCTYPE html> 
<html> 

... 

</html> 

이 코드는 동일하다 볼 수 있습니다, 아직 때마다 나는 논리가 영향을받지 않는 경우 불가능하다 페이지 unique_session_id 변수 변화를 새로 고칠. 내 유일한 결론은 페이지 새로 고침 사이에 세션이 삭제되거나 손실된다는 것입니다.

:

  • 내가 처음부터 작성한 MVC 패턴을 사용하고 있습니다.
  • session_start()이 다른 PHP 행보다 먼저 호출되고 있습니다. index.php입니다.
  • session_start()을 파일의 여러 위치로 이동 시키려고 시도했습니다. 은 세션 생성 직전이었습니다. 이것은 아무것도하지 않습니다.
  • session_write_close()을 사용해 보았지만 작동하지 않습니다.

2 논리 명령문은 페이지 새로 고침이 몇 번 발생했는지에 관계없이 세션 당 한 번만 실행해야하며 2-3 개월 동안이 방법으로 작업해야합니다. 한 페이지 씩 새로 고침 한 후 갑자기 실행되기 시작한 이유는 무엇입니까? 세션이 바뀔 때마다 논리가 TRUE로 평가되는 세션 바운즈가 어떻게됩니까?

편집은

세션 문제는 이제 웹 호스트에서 새의 php.ini 파일을 요청하여 수정되었습니다.

+2

PHP 설정의 최근 변경 사항을 확인 했습니까? –

+0

@JoshAustin 아니요. 확인해야 할 설정이 무엇 인지도 알지 못합니다. 문제의 필요한 설정을 확인하기 위해'phpinfo() '를 사용할 수 있다고 가정하고 있습니까? 기록을 위해 나는 어떤 설정도 직접 변경하지 않았습니다. – George88

+0

꽤 많은 세션 [configuration] (http://www.php.net/manual/en/session.configuration.php) 설정이 있습니다. 현재 설정과 비교해야합니다. –

답변

1

작성한 코드가 작동합니다. 코드 주석을 확인하십시오. $ _SESSION [ 'new_visit가'] false이면

if(!isset($_SESSION['new_visit'])) //1st time is not set so enter's to statement 
{ 
    $_SESSION['new_visit'] = true; //making $_SESSION['new_visit'] true 
} 

if($_SESSION['new_visit'] == true) //1st time its true 
{ 
    $this->db->store_visit(); 
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 
    $_SESSION['new_visit'] = false; //You make it false 
} 

그러나 그 의미 $ _SESSION [ 'new_visit는']로 설정된다. 지금 초 이상 시간 :

if(!isset($_SESSION['new_visit'])) //variable is set, and it will not enter here 
{ 
    $_SESSION['new_visit'] = true; // variable stays false 
} 

if($_SESSION['new_visit'] == true) //variable is false !!! 
{ 
    $this->db->store_visit(); 
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 
    $_SESSION['new_visit'] = false; 
} 
// Finally $_SESSION['unique_session_id'] stays same. 

당신은 unset($_SESSION['new_visit']);를 사용하거나에만이 문 또는 한 페이지에서 확인을하면, 그것을 위해 세션을 사용하지 않는 $new_visit 같은 변수를 사용할 수 있습니다.

+0

세션에서'unset()'을 사용하면 페이지가 새로 고침 될 때마다 부적절한 동작이 발생하여 세션을 파괴합니다. 그렇게하면 페이지가 새로 고침 될 때마다 세션이 계산됩니다. 현재이 문제는 내 코드가 별도의 파일에서 자체 테스트 될 때 작동하는 순서 임에도 불구하고 논리 문을 항상 무시하고 코드 블록을 실행한다는 사실입니다. 즉, 세션은 페이지 새로 고침 사이에서 무시되거나 삭제되는 것입니다. 후자는 내가 믿기 쉽습니다. – George88

+0

unset 그냥 예입니다, 나는 당신의 코드에 대해 잘 모릅니다, 그 문제에 대한 많은 해결책이 있지만, 왜 unique_session_id가 그대로 유지되는지, 그것이 true/false, 그리고 isset 함수에서 나온 것입니다. –

+0

나는 혼란스러워 할지도 모른다. 내 질문을 편집하여 내 문제가 무엇인지 명확하게했습니다. 내 논리는 여기에 문제가되지 않으며 예상 결과는'unique_session_id' 세션이 페이지 새로 고침 사이에서 동일하게 유지되고 각 if 문은이 목표를 달성하기 위해 한 번만 실행된다는 것입니다. 이렇게하면 모든 페이지 뷰에 대한 추가 방문을 발생시키지 않고 고유 한 방문 (세션)을 추적 할 수 있습니다. 문제는 세션이 겉으로보기에는 무시되어서 페이지가 새로 고쳐진 후에 삭제된다는 것입니다. 이로 인해 새로 고침 할 때'unique_session_id'가 각각 변경됩니다. – George88

0

업데이트 :

저장하면 모든 파일의 처음에 요구하는 별도의 파일에 처리 코드를이 특정 세션을.

if(!isset($_SESSION['new_visit'])) 
{ 
    $_SESSION['new_visit'] = true; 
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true)); 
} 
echo $_SESSION['unique_session_id']; 

나는 또한 당신이있어하는 추측을 복용 해요 :

내가 대신 당신은 또한 복잡성을 단순화,이 작업을 수행 할 수 있습니다, 당신은 세션 ID를 얻으려면 적어도 한 번 다시로드해야 할 것으로 나타났습니다 session_start()를 제대로 사용하지 않고 모든 파일을 시작할 때 사용합니다. 일단 당신이 그것을 가지고 있지 않거나 잘못 사용하고있는 하나의 페이지를 입력하면 사물이 엉망이됩니다.


참고 : 당신은이 모든 설정 세션을 삭제

session_destroy(); 

를 사용할 수 있습니다.

unset($_SESSION['new_visit']); 

을 사용하여 특정 세션을 설정 해제 할 수도 있습니다.

+0

당신은 내 질문에 대해 오해했습니다. 그래서 나는 그것을 더 분명하게하기 위해 그것을 수정했습니다. 나는 unique_session_id가 페이지가로드 될 때마다 변경되는 것을 원하지 않는다. 이것이 나의 요점이다. 제가 질문하는 이유는 코드가 변경되지 않았는데 갑자기 변하기 시작했기 때문입니다. 내 논리는 몇 달 동안 작동했지만 지금은 멈췄다. 이유를 알 수 없다. 페이지가로드 될 때마다 고유 한 ID를 원한다면이를 달성하기 위해'echo uniqid ("", true)'를 사용하면됩니다. 문제는 페이지를 새로 고칠 때 세션이 삭제되거나 PHP에 의해 로직이 무시되는 것 같습니다. – George88

+0

내 대답이 업데이트되었습니다. – Jonast92

관련 문제