2012-08-11 2 views
0

디버깅을하고 꽤 오래 검색 한 결과 무슨 일이 일어나는지 알 수 없습니다. 이것은 처음으로 custom session handler을 수행 한 것이므로 고통스럽게 명백한 것을 간과하고 있습니다. 세션과 함께 추가 정보를 저장하고 특정 사용자 그룹에 대해 사이트의 보호 된 영역에 대한 액세스를 일시적으로 비활성화 할 수 있도록 사용자 지정 세션 처리기를 구현하려고합니다.PHP 사용자 지정 세션 처리기 - 데이터베이스 연결이 NULL이 됨

내 기본 로그인 페이지 (기본 파일 기반 PHP 세션에서 잘 작동 함)에는 세션 처리기 기능과 오류 처리기를 비롯한 많은 기능을 갖춘 PHP 파일이 포함되어 있습니다. 포함 된 파일에는 데이터베이스 연결을 수행하는 세 번째 파일이 포함됩니다. 연결은 mysqli_connect()을 사용하여 이루어지며 결과 링크는 변수 $dbc에 저장됩니다. 동일한 연결이 사이트 전체에서 오류 로깅, 사이트 콘텐츠로드/편집 등을 위해 사용됩니다. 동일한 데이터베이스 연결을 사용하기로 결정했습니다. 모든 페이지에서 이미 사용되었고 세션 처리기는 거의 모든 페이지에서 사용해야합니다. 게다가. 내 코드에서 아무 것도 데이터베이스 연결을 수동으로 닫을 수는 있지만 아마도 자동으로 닫히는 것 같습니다.

내 함수는 전역 명령문을 사용하여 데이터베이스 연결 ($ dbc)에 액세스합니다. 예 : 내 open, readwrite 기능이 방식으로 변수를 사용하기로되어있다

function sess_write($id, $data) 
{ 
    global $dbc; 
    ... 

. 열기 및 읽기 함수에서 데이터베이스 연결 변수를 검사했는데 예상대로 null이 아니지만 쓰기 기능에서 갑자기 null로 표시됩니다. PHP는 잠재적으로 그 연결을 닫을 수있는 읽기와 쓰기 사이에서 뭔가를하고 있습니까? 데이터베이스 연결을 생성하는 같은 포함 된 파일에서 테스트 변수를 작성하고 쓰기 함수에서 동일한 global $test; 문을 사용 했으므로 해당 변수가 잘 나타납니다. 따라서 데이터베이스가 닫히는 것과 관련이 있다고 생각합니다. 두 번째 변수를 사용하여 데이터베이스 연결을 저장하려고했으나 (세션 처리기에서만 사용됨) 작동하지 않습니다. 어떤 아이디어? 평소처럼 바보가되고있는 걸까요?

+0

게시 후, 내가 찾고있는 답변 일 수있는 관련 게시물에 링크가 있습니다. 다음과 같이 인용됩니다 : "PHP 5.0.5부터 작성 및 닫기 핸들러는 객체 삭제 이후에 호출되므로 객체를 사용하거나 예외를 throw 할 수 없습니다." 이제 mysqli_connect 함수가 실제로 쓰기 기능에서 사용되기 전에 파괴되는 객체를 생성하고 있다고 생각합니다. 이 연결을 쓰기 기능에 액세스 할 수있게하려면 어떻게해야합니까? 나는 주제를 계속 읽으며, 너무 빨리 게시하는 것에 대해 유감스럽게 생각합니다. – dnag

+0

내가 만난 해결책은 데이터베이스 연결의 개체 기반 형식을 사용하고 연결을 다시 만드는 소멸자가있는 것입니다. 그러나 그것은 연결이 파괴되고 재현되는 것이 이상하게 보입니다. 쓰기 기능에 데이터베이스 연결을 전달하는 다른 방법이 있습니까? 아니면이 클래스 솔루션을 사용해야합니까? 필자는 쓰기 함수에 인수를 추가 할 수 없다고 생각합니다. 그 함수에 전달되는 것은 내부적으로 PHP에 의해 처리되기 때문입니다. 전역 변수가 전달되고 있지만 사용중인 변수는 객체에 대한 참조입니다. – dnag

+0

그리고 그 객체가 파괴 되었기 때문에, 왜 텍스트 변수가 잘 돌아 갔지만 $ dbc 변수는 잘 돌아 가지 않았는지를 설명합니다. 나는이 권리를 이해하고 있는가? – dnag

답변

0

귀하의 메모에 맞을 때 - 쓰기 및 닫기 전에 개체가 삭제됩니다. 이에 대한 일반적인 해결 방법은 register_shutdown_function입니다. PHP 5.4에는 이제 an interface이 있습니다.이 프로세스를 단순화하는 세션 처리기 클래스를 작성할 수 있습니다. 세션 클래스에 인터페이스를 구현하면 session_set_save_handler()에 전달할 때 기본적으로 설정이 끝나고 종료 호출이 등록됩니다.

관련 문제