PHP에서의 세션과 DB연결 문제..

tinywolf의 이미지

구글신께 물어보다가 적당한 답을 못 찾아서 이렇게 질문 드립니다.

일단 기존에 코딩되어 있는 게시판은 아래와 같이 작동합니다.

1. 한페이지안에 게시판의 모든 형태가 다 들어있고 경우에 따라 알맞은 div를 보이고 감추고 하면서 게시판의 기능을 하게 되어있습니다.
2. 게시판의 내용은 자바스크립트를 통해서 XMLRequest로 내용을 가져와서 가공해서 div안에 내용을 씁니다.
3. mysql과 php를 사용해서 XMLRequest를 처리하는데 매번 DB를 오픈하고 내용을 읽거나 쓰고 세션에 저장된 키값을 바꾸고 바뀐 키와 함께 내용을 반환해서 처리합니다.
4. 게시판이나 사용자와 같은 처리가 서로 다른 php파일에서 처리되며 각 php파일은 매번 불릴 때마다 DB와의 연결을 열었다 닫았다 합니다.

아래와 같은 생각이 들었습니다.

1. 연결에 관계없이 하나의 설정으로 접근하는 변수가 있습니다. 처음 게시판 초기화할 때 파일에 저장되어 있는데.. 이것을 매 연결마다 매번 읽자니 좀 그렇습니다. 변하는 것도 아니고..
2. 한 세션이 시작할 때 게시판을 열어놓고 계속 사용하다가 세션이 끝날 때 닫을 수 있으면 좋을 것같습니다. 하지만 사용자가 목록 한번만 보고 계속 켜놓았는데 DB가 계속 열려 있다는 것이 좀 이상하게 생각되기도 하는군요.
3. 두개의 브라우저에서 같은 게시판에 접근하면 이전에 접근했던 스크립트에서 세션키값이 바뀌기 때문에 로그아웃되고 한 컴퓨터에서는 동일한 게시판을 두개이상 열 수가 없게 되어있습니다.

그래서 PHP에서 아래와 같은 개선이 가능할지 궁금해졌습니다.

1. 어느 파일, 어느 연결이던 관계없이 동일한 값을 가지는 글로벌 변수를 만들 수 있는가?
2. DB의 연결을 세션에 보관하면 파일이 끝나더라도 그 연결이 유지되는 것인가?
3. 세션이 닫히는 시점에 DB를 닫는 행동이 가능한가?
4. 두개의 브라우저를 구분해서 세션을 나눌 수 있는가?
Deios의 이미지

1. 어느 연결에든 동작하는지 모르지만 글로벌 변수를 만들 수 있습니다...
GLOBAL $a;

3. 세션이 있는지 없는지 체크한후 연결을 끊을수는 있지만, 세션이 닫히는 시점에 끊는건 안될것 같습니다...

4. 가능합니다. 브라우져 체크하는 스크립은 많이 나와 있습니다...
조건문으로 분리되기 때문에 조건문안에 세션을 넣어두면 될것 같습니다...

================================
http://deios.kr
$find / -perm 750 | grep girl

$

송효진의 이미지

1컴 2브라우저에서 같은 게시판을 봤을 때 로그아웃 되는거라면,
로그인 처리 부분을 잘못 코딩했다고 여겨집니다.

php 의 세션은 단순하게 동작합니다.
session_start(); 하면
1. PHPSESSID 라는 쿠키가 없으면 쿠키를 굽고, 세션 파일을 생성합니다.
2. PHPSESSID 가 있으면, 생성된 세션 파일을 읽어드립니다.
3. 세션값은 serialize 되어 보관되므로 file handler 나 connect 정보는 유지되지 않습니다.
4. 읽어드린 세션값을 $_SESSION 변수에 할당합니다.
5. php 스크립트가 종료되는 시점에서 $_SESSION 변수를 serialize 해서 세션 파일에 저장합니다.
6. 세션키는 쿠키값이 지워지거나 session_destroy() 될 때 까지 유지됩니다. 바뀌지 않습니다.

익스플로러 아이콘을 통해 새창을 열면 완전히 별개의 프로세스로 동작하여,
이전에 열어놓았던 창과 쿠키공유가 되지 않습니다.

세션이 닫히는 시점은 php 스크립트가 종료되는 시점이고,
php 스크립트가 종료될 때 실행되도록 등록하는 함수가 있습니다.
http://kr.php.net/manual/en/function.register-shutdown-function.php

세션 자체를 만들어 사용할 수 있습니다.
http://kr.php.net/manual/en/function.session-set-save-handler.php
세션을 DB 에 저장하도록 작성하면,
session_start(); 시에 DB 연결이 되겠고,
connect 변수를 같이 이용하면,
session_close(); 에서 DB 연결 종료되도록 할 수 있겠지요.

mysql_connect() 는 php 스크립트 종료시에 자동으로 연결을 끊습니다.
부하를 줄이기 위해 마지막 result 를 받아온 시점에서 바로 close() 를 하는것이 아니라면 그냥 둬도 끊깁니다.
mysql_pconnect() 는 mysql_close() 를 무시합니다.

익명 사용자의 이미지

멋진 답변 감사합니다..
하지만 벽이 높군요.. (약간 복잡해질듯..) 그냥 써야겠습니다.. ㅡ_ㅡ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.