phpsource/캐시&세션&쿠키
{애플리케이셔너}3.개요
방글24
2000. 11. 23. 11:40
애플리케이셔너 개요
MS의 ASP에서 사용되는 Application 객체에서와 같이 웹애플리케이션에서 모든 방문자가 데이터를 공유할 수 있는 변수를 등록하여 사용할 수 있도록 해 줍니다. 방문자공용변수와 동일한 기능을 수행하는 것이지만, 사용자 인터페이스가 매우 간결해졌기 때문에 방문자공용변수보다 사용하기가 훨씬 편합니다.
애플리케이셔너란?
애플리케이셔너(Applicationer)는 PHP3 & PHP4에서 동작되는 클래스로 작성된 방문자공용변수를 사용할 수 있도록 제작된 툴로 ASP의 애플리케이션 객체와 같은 역할을 합니다.
저장 매체
애플리케이셔너에서 지원하는 저장 매체는 파일시스템과 데이터베이스이고, 파일시스템과 데이터베이스 모두를 동일한 인터페이스로 사용할 수 있도록 작성되어 있습니다. 따라서 향후 동일한 코드로 저장 매체만 변경할 경우 애플리케이셔너 파일을 인클루드하는 부분만 변경하면 됩니다.
< 애플리케이셔너의 구성 >
애플리케이셔너의 파일 구성
애플리케이셔너는 저장매체에 따라 별도로 작성되어 있습니다. 파일시스템을 위해 개발된 class.applfile.php와 데이터베이스를 위해 개발된 class.applbase.php가 있습니다. class.applbase.php의 경우는 별도로 DB Layer인 MiniDB가 필요합니다.
저장 매체 | 파일명 |
---|---|
파일시스템 | class.applfile.php |
데이터베이스 | class.applbase.php |
파일시스템용 애플리케이셔너
파일시스템을 이용한 애플리케이셔너는 디폴트로 /tmp 디렉토리에 파일로 저장할 수 있습니다. "/tmp"는 웹서버 상에 공유하는 임시 디렉토리이므로, 하나의 서버로 여러 명이 사용하는 경우, 예를 들면 직접 웹서버를 운영하는 것이 아니고 웹호스팅 서비스를 받는 경우에는 아래와 같이 생성자를 통하여 이 디렉토리를 자신의 웹사이트에서만 접근할 수 있는 디렉토리로 변경할 필요가 있습니다.
[code php;gutter:false]
<?php
require("./class.applfile.php");
$argv["resource"] = "/home/httpd/phpclass/applicationer";
$appl = new Applicationer($argv);
.
.
. [/code]
require("./class.applfile.php");
$argv["resource"] = "/home/httpd/phpclass/applicationer";
$appl = new Applicationer($argv);
.
.
. [/code]
위에서 지정된 디렉토리 내에 방문자공용변수에 대한 정보가 기록되어 있는 파일들이 저장됩니다. 각 변수마다 별도의 파일에 그 정보가 기록 유지됩니다. 결국 애플리케이셔너 디렉토리에는 현재 웹사이트에서 사용되고 있는 방문자공용변수의 수량만큼의 파일이 존재합니다. 이 파일명은 "appl_$varname"입니다. 여기서 $varname은 방문자공용변수명을 나타냅니다.
복수의 방문자가 동일한 방문자공용변수를 사용할 때 발생할 지도 모르는 변수값의 불확실성을 해결하기 위해 "appl_$varname" 파일에 대한 locking 및 unlocking이 필요하며, 이러한 locking 및 unlocking 역할을 할 파일이 또 하나 필요합니다. 이 파일명은 "appllock_$varname"입니다. 애플리케이셔너 디렉토리에 해당변수에 대한 lock 파일이 없으면 unlocking 상태이고, lock 파일이 있으면 locking 상태입니다.
데이터베이스용 애플리케이셔너
데이터베이스용의 경우(파일명:class.applbase.php)에는 내부적으로 미니디비를 이용하기 때문에 애플리케이셔너 객체를 생성하기에 앞서 미니디비 객체를 생성하여야 합니다.
[code php;gutter:false]
<?php
require("./class.mysql.php"); // 미니디비(MySQL용) 0.2.2
require("./class.applbase.php"); // 애플리케이셔너(디비용) 0.0.2
$base = new MiniDB(
"디비 호스트명",
"사용자 id",
"디비 패스워드",
"디비명",
"접속방식"
);
$appl = new Applicationer;
.
.
. [/code]
require("./class.mysql.php"); // 미니디비(MySQL용) 0.2.2
require("./class.applbase.php"); // 애플리케이셔너(디비용) 0.0.2
$base = new MiniDB(
"디비 호스트명",
"사용자 id",
"디비 패스워드",
"디비명",
"접속방식"
);
$appl = new Applicationer;
.
.
. [/code]
데이터베이스를 이용하는 애플리케이셔너는 여러가지 데이터베이스를 다루기 위해 내부적으로 공개된 DB 레이어인 미니디비를 사용하기 때문에 미니디비에서 지원되는 데이터베이스를 애플리케이셔너에서도 그대로 사용할 수 있습니다. 미니디비에 대해서는 미니디비 메뉴를 참조하세요. 현재(2001.6)까지 MiniDB에서 지원되는 데이터베이스로는 MySQL, 오라클, 포스트그레스, 사이베이스, MSQL, MSSQL, Informix가 있습니다.
데이터베이스용 애플리케이셔너에서 사용하는 디비 테이블명은 "Applicationer"입니다. 만약 이 테이블명을 변경하려면 아래와 같이 생성자의 입력인자로 테이블명을 지정하여 줍니다.
[code php;gutter:false]
<?php
require("./class.mysql.php"); // 미니디비(MySQL용) 0.2.2
require("./class.applbase.php");
$argv["resource"] = "새로운 테이블명";
$appl = new Applicationer($argv);
.
.
. [/code]
require("./class.mysql.php"); // 미니디비(MySQL용) 0.2.2
require("./class.applbase.php");
$argv["resource"] = "새로운 테이블명";
$appl = new Applicationer($argv);
.
.
. [/code]
데이터베이스용 애플리케이셔너에서의 locking 및 unlocking
아래에 있는 애플리케이셔너의 테이블 구조(MySQL용)를 보면 알 수 있지만, 현재 방문자공용변수를 사용 중인지 아닌지를 나타낼 수 있는 필드 islock가 준비되어 있습니다. 이 필드에 "0"이 기록되어 있으면 현재 필드를 어떠한 방문자도 사용하고 있지 않는 상태이므로 현재 필드에 해당하는 방문자공용변수를 자유롭게 읽고 쓸 수 있습니다. 그러나 이 필드에 "1"이 기록되어 있으면 누군가 현재 필드를 사용하고 있는 상태를 나타내므로 이 때는 이 필드에 기록되어 있는 방문자공용변수를 다룰 수 없습니다.
[code sql;gutter:false]
CREATE TABLE Applicationer (
id varchar(255) not null PRIMARY KEY,
value text not null,
islock SET("0","1") not null DEFAULT "0",
lastused int(8)
); [/code]
id varchar(255) not null PRIMARY KEY,
value text not null,
islock SET("0","1") not null DEFAULT "0",
lastused int(8)
); [/code]
대기 시간(Waiting Time)
만약 다른 방문자가 임의의 방문자공용변수를 다루기 위해 lock 파일을 생성하거나 또는 islock 필드에 "1"이 기록한다면 또 다른 방문자의 스크립트는 대기 상태에 들어가게 됩니다. 최대 대기 시간은 5초로 설정되어 있으며, 이 대기 시간 내에 현재 방문자공용변수를 사용하고 있는 스크립트가 사용을 끝내고 lock 파일을 삭제하거나 또는 islock 필드에 "0"으로 설정한 후 종료하게 됩니다. 그러면 대기 상태에 있던 또 다른 스크립트가 해당하는 방문자공용변수를 사용할 수 있게 됩니다. 5초로 설정된 최대 대기 시간은 비상시를 대비하여 설정된 시간이며, 접속하는 방문자가 많다고 하더라도 대부분의 경우에는 수(십) 밀리세컨드 이내에 제어권을 되돌려 받게 될 것입니다. 최대 대기 시간이 지나도록 lock 파일이 존재하거나 또는 islock 필드의 값이 계속 "1"인 경우에는 강제로 lock 파일을 삭제하거나 islock 필드의 값을 "0"으로 재설정한 후 해당하는 방문자공용변수를 다룰 수 있게 해 줍니다. 애플리세이셔너가 이러한 알고리즘을 이용하기 때문에, 전부 또는 전무를 요구하는 트랙잭션 처리로 얻어지는 100% 신뢰성있는 데이터를 제공하지는 않습니다. 100% 신뢰성있는 데이터를 얻기를 원한다면 소스코드를 수정하여 데이터베이스에서 제공하는 트랙잭션 기능을 이용하여야 할 것 입니다.