2008-10-01 11 views
55

"나는 서버에 손대지 않았다고 맹세합니다"라는 상황 중 하나가 있습니다. 솔직히 PHP 스크립트를 건드리지 않았습니다. 내가 겪고있는 문제는 PHP 데이터가 다른 페이지 또는 페이지 새로 고침에 저장되지 않는다는 것입니다. 세션 변수 (예 : $ _SESSION [ 'foo'] = "foo")를 설정하여 동일한 페이지에서 다시 인쇄 할 수 있기 때문에 새로운 세션이 올바르게 생성된다는 것을 알고 있습니다. 그러나 동일한 변수를 사용하려고하면 다른 페이지에 설정되어 있지 않습니다! 내 호스트 서버에서 무슨 일이 일어나고 있는지 볼 수있는 PHP 함수 나 정보가 있습니까?PHP 세션 데이터가 저장되지 않습니다.

다음은 내 호스트의 서버에서 올바로 작동하지 않는 스크립트 예입니다 지금 :.

<?php 
session_start(); 
if(isset($_SESSION['views'])) 
    $_SESSION['views'] = $_SESSION['views']+ 1; 
else 
    $_SESSION['views'] = 1; 

echo "views = ". $_SESSION['views']; 
echo '<p><a href="page1.php">Refresh</a></p>'; 
?> 

'보기'변수 내가이 자신의 측면에서 문제가 생각하고 페이지 새로 고침을 수행 한 후 증가 결코 극복,하지만 난 내가 먼저 완전한 바보 아니에요 있는지 확인하고 싶었다.

여기 내 호스트의 서버 (PHP 버전 4.4.7)에 대한은 phpinfo()이다 : alt text

+0

회신을 시도하십시오. echo '

Refresh

'; 과 헤더 ('위치 : http : //'.$_SERVER [ 'HTTP_HOST']. '페이지 1.php'); –

답변

41

모든 유용한 정보를 제공해 주셔서 감사합니다. 내 호스트가 서버를 변경하고 더 이상 존재하지 않는/var/php_sessions 이외의 다른 세션 저장 경로를 사용하기 시작했습니다. 해결책은 내 모든 스크립트 파일에 ini_set(' session.save_path','SOME WRITABLE PATH');을 선언하는 것이었지만 고통 스러웠을 것입니다. 나는 호스트와 대화를 나누었고 세션 경로를 명시 적으로 존재하는 실제 경로로 설정했습니다. 희망이 세션 경로 문제가있는 사람을 도와줍니다.

+1

코드 줄의 예를 들어 주시겠습니까? – Steeven

+0

고마워요! 매력처럼 작동합니다! – raBne

7

사용 phpinfo()session.* 설정을 확인하십시오.

정보가 쿠키에 저장되어 있고 브라우저가 쿠키를 허용하지 않을 수도 있습니다.

먼저 확인하고 결과로 돌아 오십시오. 의 session.save_path 유효한 하나

또한

당신의 phpinfo()에 대해서 ....이 변수의 덤프가 있고 콘텐츠를 볼 수있는 print_r($_SESSION); 할 수있다? 웹 서버에이 디렉토리에 대한 쓰기 권한이 있습니까?

희망이 도움이됩니다.

+0

고마워요! 내 문제는 쿠키가 제대로 저장되지 않아 페이지간에 모든 세션 변수가 손실된다는 것입니다. 결정된! – tozhan

2

"보기"의 ​​값을 증가시키기 전에 확인하십시오. 어떤 이상한 이유로, 그것이 문자열로 설정 얻고 경우에, 당신은 경로 저장 세션이 웹 서버로 쓸 경우에, 항상보고 1.

if (isset($_SESSION['views'])) { 
    if (!is_numeric($_SESSION['views'])) { 
     echo "CRAP!"; 
    } 
    ++$_SESSION['views']; 
} else { 
    $_SESSION['views'] = 1; 
} 
5

확인 돌아갑니다 하나를 추가 할 때 .

쿠키 다시 설정하고 전송되고 있는지 확인하기 위해 불을 지르고 확장자

사용 파이어 폭스를 (내가 뭔가를 테스트를 끄면 잊지) .. 쿠키가 설정되어 있는지 확인합니다.

관련없는 노트에서는 php5를 살펴보기 시작합니다. 4.4.9가 php4 시리즈의 마지막이기 때문입니다.

2

내 서버 (PHP 5)에서 코드를 테스트했기 때문에 코드 오류가 발생하지 않도록 할 수 있습니다.

  1. 당신이 어디 session_unset() 또는로 세션()를 호출 :

    여기에 무엇을 확인입니까? 이 함수는 세션 데이터를 즉시 삭제합니다. 대본 끝 부분에 이것을 넣으면, 당신이 묘사하는 것과 똑같이 행동하기 시작합니다.

  2. 모든 브라우저에서 동일하게 작동합니까?특정 브라우저에서만 작동하고 작동하지 않는 브라우저에서는 작동하지 않는 브라우저에서 구성 문제가 발생할 수 있습니다 (예 : 쿠키를 사용 중지했다가 사용하지 않도록 설정했거나 실수로 쿠키를 차단 한 경우).

  3. 세션 폴더에 쓸 수 있습니까? is_writable()로 테스트 할 수 없으므로 phpinfo()에서/var/php_sessions와 같은 폴더로 이동하여 세션이 실제로 만들어 졌는지 확인해야합니다.

1

내가 알고 내가 (아파치 1 OSX를 그냥 PHP5로 전환) 발견 나는 비슷한 문제가있을 때 하나 개의 솔루션이였습니다 (즉, 해제 ($ _ SESSION [ '키']);) (1) 특정 키를 해제하기 그것이 구원을 얻지 못하게했다. 내가 그 열쇠를 더 이상 설정하지 않은 즉시 구원 받았다. 다른 사이트의 해당 서버를 제외하고는이 코드를 다시 본 적이 없지만 다른 변수였습니다. 어느 것도 특별한 것이 아니 었습니다.

1

다음은 다른 주석에서 다루지 않은 일반적인 문제점입니다. 호스트가 일종의 캐시를 실행하고 있습니까? 자동으로 결과를 캐싱하는 경우 이런 종류의 동작이 발생합니다.

1

실수로 페이지의 session_start() 문구가 누락 된 경우에도이 문제가 발생할 수 있습니다. (즉, 해제 ($ _ SESSION [ '키']);)이었다

2

내가 알고 내가 (아파치 1 OSX를 그냥 PHP5로 전환) 발견 나는 비슷한 문제가있을 때 하나 개의 솔루션은 하나의 특정 키를 해제하기이었다 저장하지 못하게합니다. 내가 그 열쇠를 더 이상 설정하지 않은 즉시 구원 받았다. 다른 사이트의 해당 서버를 제외하고는이 코드를 다시 본 적이 없지만 다른 변수였습니다. 어느 것도 특별한 것이 아니 었습니다.

감사합니다. 이것은 나를 도왔다. 나는 세션 변수를 삭제하고 있었고 어떤 이유로 그것이 세션이 커밋되지 않도록 유지하고있었습니다. 이제는 null로 설정하고 있습니다. (내 앱에서는 괜찮습니다) 작동합니다.

0

session_write_close()를 사용하고 있는지 확인하십시오. 어디서나, 나는이 세션을 사용하여 다른 세션을 마친 후 다시 세션에 쓰려고 노력 중이었고 작동하지 않았다. 그래서 그냥 sh * t로 주석을 달았다.

2

php5에서 세션을 설정했다면 php4 페이지에서 읽으면 정확한 위치에서 보지 못할 수도 있습니다! 페이지를 동일한 PHP 버전으로 만들거나 session_path를 설정하십시오.

3

스크립트가 실행되는 폴더의 그룹 및 소유자를 확인하십시오. 그룹 ID 또는 사용자 ID가 잘못된 경우 (예 : root로 설정하면 세션이 제대로 저장되지 않습니다.

8

같은 문제가있었습니다. 서버 관리자가 session.cookie_secure 부울을 On으로 변경했는데 이는 쿠키가 보안 연결을 통해서만 전송된다는 것을 의미합니다. 쿠키가 발견되지 않았기 때문에, php가 매번 새로운 세션을 생성하고 있었기 때문에 세션 변수가 보이지 않았습니다.

+1

이것이 제 문제였습니다. 저는 session.cookie_secure를 스스로 설정했습니다. 이상한 점은 갑자기 멈추기 전에 약 2 주 동안 불안한 환경에서 일을 계속했다는 것입니다. 그러므로 나는 둘을 연결하지 않을 것입니다. –

2

비슷한 문제에 대한 답을 찾기 위해 나이를 먹었습니다. 매우 유사한 코드가 동일한 서버의 다른 .php에서 완벽하게 작동 했으므로 코드 나 설정에 문제가 없었습니다. 이 문제는이 페이지의 세션에 매우 많은 양의 데이터가 저장되어 발생했습니다.한 곳에서 다음과 같은 행을 보았습니다 : $_SESSION['full_list'] = $full_list$full_list은 데이터베이스에서로드 된 데이터 배열입니다. 각 행은 약 150 요소의 배열이었다. 코드가 처음 몇 년 전에 작성되었을 때 DB에는 약 1000 개의 행만 포함되어 있었기 때문에 $full_list에는 약 100 개의 요소가 포함되어 있으며 각 요소는 약 20 개의 요소로 구성되어 있습니다. 시간이 지남에 따라 20 개의 요소가 150과 1000 행으로 바뀌어 17000이되었으므로 코드는 64 meg의 데이터를 세션에 저장하고있었습니다. 분명히이 양의 데이터가 저장되면서 다른 것을 저장하는 것을 거부했습니다. 세션에 저장하지 않고 데이터를 로컬에서 처리하도록 코드를 변경 했더니 모든 것이 완벽하게 작동했습니다.

1

세션 쿠키 경로가 "/"대신 "//"로 설정되었습니다. 방화범이 끄는 사람은 굉장합니다. 누군가가 도움이되기를 바랍니다.

6

내가

<? 
    session_start(); 
    echo $_SESSION['a']; 
?> 

변수 $_SESSION['a'] index2.php 문제를

index.php를

<? 
    session_start(); 
    $_SESSION['a'] = 123; 
    header('location:index2.php'); 
?> 

을 다음했다가 제대로 설정되지 않았습니다. 그럼 난 변경된 index.php acordingly

<? 
    session_start(); 
    $_SESSION['a'] = 123; 
    session_write_close(); 
    header('location:index2.php'); 
?> 

난 그냥 세션 변수의 변화가 당신이하지 수 있도록

+0

/이 문제는 'location'과'index2.php' header ('location : index2.php ') 사이의 누락 된 공간으로 인해 헤더가 리디렉션되지 않는다는 것입니다. <=는 작동하지 않지만 this =>'header ('location : index2.php'); ' –

+0

이것은 나를 위해 일했습니다! 이유를 알고 싶습니다. tho :/ – deacs

11

확인 충분히 :) 빠른 아니라고 자신에게 그것을 설명이 내부적으로 무엇을 의미하는지 잘 모릅니다 https : //와 http : //를 섞습니다. 세션 변수는 보안 세션과 비보안 세션간에 흐르지 않습니다.

1

domain.com/destpage.php로 리디렉션 된 www.domain.com/auth.php의 보안 페이지를 사용할 때이 문제가 발생했습니다. 나는 auth.php 링크에서 www를 삭제하고 작동했다. 이것은 다르게 작동했기 때문에 저를 던졌습니다. 내가 목적지에 도착했을 때 세션은 설정되지 않았다.

1

자주 간과되는 일반적인 문제는 session_start() 명령 전에 다른 코드 나 여분의 공백이 없어야한다는 것입니다.

나는 session_start() 전에 빈 줄이있어 제대로 작동하지 않는 곳에서이 문제가 발생했습니다.

1

php.ini를 편집하십시오.
나는 session.gc_probability의 값이 1 인 생각, 그래서 내 솔루션 추가 0

session.gc_probability=0 
1

로 설정 : 당신이 올바른 도메인에 액세스하는 경우

확인. www.mysite.com을 사용하여 세션을 시작한 후 mysite.com (www 제외)에서 수신하려고했습니다.

저는 모든 도메인을 htaccess로 재 작성하여 안전한 쪽/사이트에 www를 추가함으로써이를 해결했습니다.

http 또는 https를 사용하는지 확인하십시오.

+0

실제로 https://example.net을 사용하면 브라우저가 세션 쿠키를 저장하지 않았습니다. https://www.example.net으로 성공했습니다. 하지만 호스트 이름이 어떻게 달라질 수 있습니까? – xebeche

+0

각 하위 도메인에는 세션을위한 자체 임시 폴더가 있다고 가정합니다. 'www'는 하위 도메인으로 간주됩니다. –

+0

필자의 경우, 애플리케이션은'domain = www.example.net'과 정확히 똑같은 Set-Cookie 헤더를 보냈지 만 Firefox는 조용히 (이 로그를 남길 수있는 방법으로 2 시간을 보았습니다.) 사이트가' example.net'. 응용 프로그램을 변경하여'domain = example.net'을 보냄으로써 수정했습니다. BTW, 서버에서 이것은'UseCanonicalName On'과 함께'ServerName www.example.net'에서 발생했습니다. – xebeche

0

내가해야 할 또 다른 몇 가지 사항 (동일한 문제가있었습니다. PHP를 5.4로 업그레이드 한 후에도 Sesson 유지가 없습니다). 많은 사람들이 서버의 PHP에 따라 필요하지 않습니다.ini가 포함되어 있습니다 (phpinfio() 확인);

session.use_trans_sid=0 ; Do not add session id to URI (osc does this) 
session.use_cookies=0; ; ensure cookies are not used 
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT 
session.save_path=~/tmp/osc; ; Set to same as admin setting 
session.auto_start = off; Tell PHP not to start sessions, osc code will do this 

기본적으로 php.ini는 쿠키가 설정되어 있지 않아야하며 세션 매개 변수는 osc가 원하는 것과 일치해야합니다.

application_top.php에서 몇 세션 코드 조각을 변경해야 할 수도 있습니다 - tep_session_is_registered (...) 호출 (예 : 탐색 객체)에 존재하지 않는 객체 생성, $ HTTP_ 변수를 최신 $ _SERVER와 빈 개체 (Google for info)에 대한 몇 가지 다른 isset 테스트. 원래의 sessions.php 파일 (/ classes 및 includes/functions 포함)을 약간 수정 한 application_top.php를 사용하여 다시 사용할 수있게되었습니다. php.ini 설정이 주된 문제 였지만 물론 서버 회사가 기본값으로 설치 한 내용에 따라 다릅니다.

관련 문제