안녕하세요. 명월입니다.
이 글은 PHP에서 직렬화를 사용하는 방법에 대한 글입니다.
예전에 Java나 C#에서 직렬화에 대한 설명을 한 적이 있습니다.
직렬화한 클래스나 배열등의 리스트를 바이너리화 하는 것을 직렬화라고 합니다. 솔직히 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에서 직렬화를 사용하는 방법에 대한 글이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Development note > PHP' 카테고리의 다른 글
[PHP] cURL(HttpConnection)을 이용해서 Naver와 Daum의 실시간 API를 가져오는 방법 (0) | 2019.11.26 |
---|---|
[PHP] 암복호화 함수 md5와 base64 (0) | 2019.11.13 |
[PHP] 날짜와 시간을 다루는 방법 (0) | 2019.11.11 |
[PHP] Socket통신을 하는 방법 (1) | 2019.11.10 |
[PHP] PHP와 JSP 간의 Session 공유(WDDX) (2) | 2019.11.08 |
[PHP] PHP에서 파일을 압축 또는 해제하는 방법 (0) | 2019.11.07 |
[PHP] htmlParser(phpquery라이브러리)를 이용해 XML파일(HTML)을 사용하는 방법 (0) | 2019.11.06 |
[PHP] ajaxForm을 이용한 파일 업로드(프로그래스바로 파일 업로드 상태를 표시하는 방법) (0) | 2019.10.26 |