[PHP] 직렬화(Serializable)


Development note/PHP  2019. 11. 9. 09:00

안녕하세요. 명월입니다.


이 글은 PHP에서 직렬화를 사용하는 방법에 대한 글입니다.


예전에 Java나 C#에서 직렬화에 대한 설명을 한 적이 있습니다.

링크 - [Java] 직렬화(Serializable)

링크 - [C#] 직렬화(Serialization)


직렬화한 클래스나 배열등의 리스트를 바이너리화 하는 것을 직렬화라고 합니다. 솔직히 PHP에서는 이 직렬화를 잘 사용하지는 않습니다.

C#이나 Java에서는 소켓 통신등에서 서버와 클라이언트가 같은 언어라고 했을 때 클래스의 데이터를 그대로 전송하기 위한 목적으로 자주 사용하는데 PHP에서는 소켓 통신을 잘 사용하지 않습니다.

전혀 사용하지 않는 것은 아닙니다만, 거진 PHP와 다른 언어 즉, Java나 C#으로 이루어진 서버 환경과 통신을 하지, 같은 PHP간의 통신은 없다고 봐야 합니다.

왜냐하면 여러 apache로 이루어진 다중 서버라고 한다면 Session share로 넘기는 것이 더 편하기 때문입니다.이 session에 저장할 때 클래스 타입이나 배열 타입을 넣게 되면 이 직렬화로 session에 들어갈 것입니다. 그건 PHP측에서 자동으로 해주기 때문에 프로그래밍을 하는 입장에서는 필요가 없습니다.


그런데도 필요할 때가 있는데, Session간에 데이터를 share링하거나 데이터를 클래스 형식으로 보존해야 할 경우는 사용할 수 있겠네요.링크 - https://www.php.net/manual/en/function.serialize.php

링크 - https://www.php.net/manual/en/function.unserialize.php

<?php
  // 시간을 한국 표준시로 맞춘다.
  date_default_timezone_set("Asia/Seoul");
  class SessionCount{
    // 접속 카운팅을 위한 변수
    private $count;
    // 마지막 접속 시간
    private $lastTime;
    // 현재 접속 시간
    private $connectTime;
    // 처음 new로 생성되면 count는 0이 된다.
    public function __construct(){
      $this->count = 0;
      $this->connectTime = date("Y-m-d h:i:s A");
    }
    // set함수가 호출되면 count는 1이 증가되고 현재 시간의 값을 마지막 접속 시간으로 바꾸고 현재 시간의 값은 새로 넣는다.
    public function set(){
      $this->count = $this->count +1;
      $this->lastTime = $this->connectTime;
      $this->connectTime = date("Y-m-d h:i:s A");
    }
    // Count 값을 가져온다.
    public function getCount(){
      return $this->count;
    }
    // 마지막 접속 시간을 가져온다.
    public function getLastTime(){
      return $this->lastTime;
    }
  }
  // 직렬화된 클래스 값을 가져온다.
  function getData($file){
    // 파일이 존재하지 않으면 SessionCount라는 클래스를 생성한다.
    if (!file_exists($file)) {
      return new SessionCount();
    }
    try{
      if(@$handle = fopen($file, 'r')) {
        $contents = fread($handle, filesize($file));
      }
      // 직렬화된 파일을 역직렬화하여 클래스를 생성한다.
      return unserialize ($contents);
    } catch(Exception $e){
      print_r($e);
      die();
    } finally{
      @fclose($handle);
    }
  }
  // 클래스의 값을 파일로 저장한다.
  function setData($file, $clz){
    try {
      // 클래스의 값을 직렬화한다.
      $contents = serialize ($clz);
      if (@$handle = fopen($file, 'w')) {
        // 파일로 저장한다.
        fwrite($handle, $contents);
      }
    } catch (Exception $e) {
      print_r($e);
    } finally{
      @fclose($handle);
    }
  }
  // 직렬화할 데이터를 저장할 경로
  $file = 'd:\file\serialize.data';
  // 클래스를 가져온다. 만약 파일이 없으면 new로 새로운 할당을 한다.
  $clz = getData($file);
  $clz->set();
  // 직렬화를 하여 파일로 클래스를 저장한다.
  setData($file,$clz)
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  count = <?=$clz->getCount()?><br />
  last connect Time = <?=$clz->getLastTime()?>
</body>
</html>

접속을 하니 현재 카운터와 마지막 접속 시간이 나옵니다.

직렬화된 파일이 제대로 폴더에 저장이 됩니다. 직렬화된 파일을 보니 데이터가 직렬화 형태의 값으로 저장되어 있습니다.

여기서 제가 새로고침을 몇 번 누르게 되면 카운터는 계속 증가하게 됩니다.

여기까지 PHP에서 직렬화를 사용하는 방법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.