phpsource/클래스&객체2001. 4. 12. 10:45
인풀링 클래스는 인스턴스 풀링(Instance Pooling)을 흉내내기 위해 작성된 클래스입니다.
인스턴스 풀링이란 자주 사용하는 객체를 메모리에 상주시키고, 보다 빠르게 객체를 사용할 수 있도록 하는 것입니다. 동시에 많은 사용자가 접속했을 때 이미 메모리에 올라온 인스턴스가 있으면 그것을 사용하고, 올라온 내용이 없을 때는 인스턴스를 하나 더 만듭니다.
이러한 인스턴스 풀링은 PHP에서 내장하여 지원하여야만 효과적으로 사용할 수 있을 것입니다. 그러나 지원되지 않으니 좀 미숙하더라도 편리하게 사용될 것 같아 인풀링 클래스를 작성하여 공개합니다.
이것은 Q&A 게시판에 채명신 님이 질의하신 내용에 대한 결과로 얻어진 것입니다.
아래는 채명신 님의 질문 내용의 요약입니다.
[채명신 님의 질문 내용]
생성한 클래스를 다른 사람이 참조할수 있는 방법은요?
자바에서의 풀링 기법과 비슷하다고나 할까??
그러니까 한번 생성된 클래스는 (특히 복잡한 계산에의해 생성된 클래스를) 클라이언트의 요청시마다 독립적인 각각의 클래스를 새로 만들어서 자신이 만든 클래스만을 참조 하는것이 아니라, 기존에 만들어진 클래스가 있다면 그것을 참조 하는 것이죠. 그니까 제일 처음에 로그인함 사람이 만들면 컴이 꺼진기전에 다른 사람은 만든 글래스를 그냥 공유 해서 쓰는 것이죠.
[답장 내용]
개체 또는 인스턴스 풀링(instance pooling)을 원하시는 것 같네요. PHP에서는 영구접속 방법을 통한 데이터베이스 풀링이 지원되기는 하지만 인스턴스 풀링까지는 지원되지 않는 것 같습니다. 하지만 마음만 먹는다면 흉내는 얼마든지 낼 수 있겠지요. 좀 복잡해 지겠지만 이것도 함수 또는 클래스로 미리 작성해 놓고 사용하면 쓸만하겠네요. 인스턴스 풀링을 흉내내기 위해 필요한 것을 살펴보지요.
1. 모든 방문자가 공유하는 영역 만들기
이것은 제가 공개한 애플리케이셔너를 참조하시든지 아니면 세션파일과 같이 /tmp 에 모든 방문자가 공유할 파일을 생성시키면 되겠지요. 인스턴스 풀링처럼 필요한 정보를 메모리에 상주시키려면 공유메모리를 이용하면 되겠지요. 이러한 공유영역에는 복수의 방문자가 공유할 생성된 클래스 정의와  객체가 저장되겠지요.
2. 메소드 및 프로퍼티의 직렬화/객체화하기
객체 멤버를 다른 페이지로 넘기기 위해서는 PHP4에서 지원하는 serialize() 함수와
unserialize() 함수를 이용하셔야 합니다. 이에 대한 자세한 정보는 제 홈페이지 "핍클래스홈 >> 객체에 관련된 정보 >> Serialize/Unserialize 또는 메소드 다루기(PHP4)"를 참조하세요. 추가적으로 말씀드린다면 serialize/unserialize 함수에서는 객체멤버를 다루기는 하지만 클래스를 다루어 주지 않거든요. 사실 Serialize/Unserialize 정보를 공개하면서도 클래스 정의 부분을 포함시킬까 말까하고 고민을 하였었는데 복잡해 질 것 같아 생략했었지요.
아무튼 위 두가지에 대한 지식만 가지고 계시다면 님도 원하시는 인스턴스 풀링 기능을 흉내낼 수 있는 함수를 작성할 수 있으리라 봅니다. 위에서도 이야기했지만 다른 것보다도 클래스 정의 부분을 공유하는 것만 주의한다면 별 어려움은 없을 것입니다.
함수로 만들어 놓으면 상당히 유용한 기능이 될 것 같네요. 앞으로 시간이 허락되면 작성하여 공개하고 싶군요.
[채명신 님의 재질의 내용]
그니까  말씀 하신 방법중에 "인스턴스 풀링처럼 필요한 정보를 메모리에 상주시키려면 공유메모리를 " 이용하면 되겠지요. 이러한 공유영역에는 복수의 방문자가 공유할 생성된 클래스 정의와  객체가 저장되겠지요......................ㅠ.ㅠ"
이 메모리는 어커 쎠야 하는지요  ㅠ.ㅠ ??????
관련 소스나 참고 알고리즘이 있으시면 도움을 바랍니다. 13 일 까지 해결 해야 하는데........ 내가 이해나 할수 있을까.  흑흑
 초보자인 저는 더욱 난해 하네요.. 다시한번 답변은 정말 감사 합니다  그러나. 공유 메모리...ㅠㅠ 그놈의 메모리는 .... 지금은 시간이 없는 관계로 없는 실력으로 자바로 써볼려고 합니다 ..
언제가  만들어지면  이용 해야겠네요 ^^ 또 이런 비슷한 일이 생기면 ........... 도움을 많이 받아 갑니다.. 헤헤 ^ ^
그럼 시간이 되시면 부탁 드립니다 . 감사 감사
[재답장 내용]
우선 급한대로 인스턴스 풀링을 구현하는 클래스를 조잡하게나마 작성하여 Tip&Tech&Download 게시판에 올렸습니다. 자세한 사용법까지 설명할 수는 없고 테스트용 샘플도 포함시켰으니 살펴보세요.
(수정:2010.1.12) 홈페이지 이동으로 여기에서 다운로드 받으세요.
모든 방문자가 공유할 클래스 정의는 이벤트 파일에 변수로서 저장하게 됩니다. 물론 일반 텍스트 파일로도 작성할 수도 있으며 이렇게 하여야 될 것 같으나 시간이 더 걸릴 것 같아 급한대로 변수에 저장시켰습니다.
인풀링 클래스(인스턴스 풀링을 흉내내기 위해 작성된 클래스) 사용상의 주의점
1. 위에서도 언급했듯이 급하게 만들다보니 버그가 상존하지 않을까 걱정됩니다.
2. 공유메모리와 세마포어를 이용하여 작성되었습니다. 그러나 공유메모리용 함수가 PHP 4.0.4부터 성능이 대폭 개선된 함수를 새로이 제공되고 있으나 여기에서는 기존의 공유메모리 함수인 shm_...()함수를 사용하였습니다. 그러니 PHP 4.0.4를 사용하시는 분은 개선된 공유메모리 함수인 shmop_...() 함수를 사용하세요.
3. 모든 방문자가 공유할 클래스 정의는 이벤트 파일에 변수로서 저장하도록 하였습니다. 이부분을 좀 더 개선한다면 일반 텍스트 파일로 작성하는 것이 바람직할 것입니다. 아래는 파일에 첨부된 이벤트 파일 내용입니다. 이 이벤트 파일에 있는 pooling_onStart() 함수는 최초의 방문자가 방문할 때만 실행하게 됩니다. 이 함수에서 돌려주는 $class에 클래스 정의가 담겨지며 되돌려진 $class의 내용은 인풀링 클래스 내에서 객체로 생성한 후 공유메모리에 클래스 정의와 객체가 함께 저장하여 다음 방문자들이 공유할 수 있도록 합니다.
[code php;gutter:false] function pooling_onStart() {
$class = "
class test {
var \$a = 1000;
var \$b = "\\\$b값";

function output() {
return "나 함수";
}
}
";
return $class;
} [/code]
클래스 정의를 $class와 같은 변수에 담을 것이 아니라 아래와 같이 텍스트 파일에 저장한 후 인풀링 클래스에서 읽어들이는 것이 좋을 것입니다.
[code php;gutter:false] class test {
var $a = 1000;
var $b = "\$b값";

function output() {
return "나 함수";
}
} [/code]
이렇게 하니까 가독성이 훨씬 좋지 않습니까? 이것을 구현하는 것을 여러분이 해보시지 않겠습니까? 제가 해도 되겠지만...
4. 아래는 인풀링 클래스를 테스트하는 프로그램 test.php입니다. 이 파일도 첨부되어 있습니다.
[code php;gutter:false] <?php
require("./class.poolshm.php");

$ip =& new inPooling;
if ("delete" == $exec)
$ip->delete();
$obj =& $ip->read();

echo $obj->a."\n";
echo $obj->b."\n";
echo $obj->output()."\n";

$obj->b = $exec;
$ip->write($obj);
$ip->close();
?> [/code]
아래와 같은 방법으로 서로 다른 컴퓨터에서 아니면 다른 브라우저로 실험해 보세요.
http://....../inpooling/test.php
http://....../inpooling/test.php?exec=delete
http://....../inpooling/test.php?exec=연습
화면에는 아래와 같이 나타날 것입니다. 여기서 두번째 줄의 내용을 URL의 exec파라미터의 값에 따라 계속 변할 것이고 exec값이 "delete"이면 현재의 공유메모리의 내용이 지워집니다.
1000
$b값
나 함수
5. 인풀링 클래스는 PHP 4 버전에서만 사용할 수 있습니다. PHP 3.x.x에서는 지원하지 않는 레퍼런스(참조)를 사용하였습니다. 참조에 대한 자세한 설명은 제 홈페이지 "class & object>> 참조(레퍼런스)"를 보세요.

Posted by 방글24