PHP 매뉴얼
이전 |  | 다음

# LXXXIV. PostgreSQL 함수

# 소개

PostgreSQL 데이터베이스는 비용이 필요 없는 오픈 소스 프로덕트입니다. 본래 UC Berkeley Computer Science Department에서 개발한 Postgres는 현재 몇몇 상용 데이터베이스에서 채용한 객체관계 개념을 이끌었습니다. SQL92/SQL99 언어 지원, 트랜젝션, 참조 관계, 저장 프로시저, 확장 가능한 타입을 제공합니다. PostgreSQL은 원래의 버클리 코드에서 오픈 소스로 이어졌습니다.

# 요구 사항

PostgreSQL 지원을 사용하려면, PostgreSQL 6.5 이상이 필요하며, 모든 PostgreSQL 모듈 기능을 사용하려면 PostgreSQL 7.0 이상이 필요합니다. PostgreSQL은 멀티바이트 문자 인코딩을 포함하여 많은 문자 인코딩을 지원합니다. PostgreSQL의 현재 버전과 관련 정보는 http://www.postgresql.org/과 http://techdocs.postgresql.org/에 있습니다.

# 설치

PostgreSQL 지원을 활성화하려면, PHP를 컴파일 할 때 `--with-pgsql[=DIR]`이 필요합니다. DIR은 PostgreSQL 베이스 설치 디렉토리로, 기본값은 `/usr/local/pgsql`입니다. 공유 오브젝트 모듈을 이용할 수 있으면, `php.ini`에서 extension 지시자나 dl()을 사용하여 PostgreSQL 모듈을 읽어들일 수 있습니다.

# 런타임 설정

이 함수의 작동은 `php.ini` 설정에 영향을 받습니다.

표 1. PostgreSQL 설정 옵션

이름 | 기본값 | 변경가능성
--- | --- | ---
pgsql.allow_persistent | "1" | PHP_INI_SYSTEM
pgsql.max_persistent | "-1" | PHP_INI_SYSTEM
pgsql.max_links | "-1" | PHP_INI_SYSTEM
pgsql.auto_reset_persistent | "0" | PHP_INI_SYSTEM
pgsql.ignore_notice | "0" | PHP_INI_ALL
pgsql.log_notice | "0" | PHP_INI_ALL

PHP_INI_* 상수에 대한 자세한 내용 및 정의는 ini_set()을 참고하십시오

위 설정 지시어에 대한 간단한 설명입니다.

`pgsql.allow_persistent` boolean

  Postgre 지속 접속 허용 여부.

`pgsql.max_persistent` integer

  프로세스 당 Postgre 지속 연결의 최대수.

`pgsql.max_links` integer

  지속 연결을 포함하여, 프로세스 당 Postgres 연결의 최대수.

`pgsql.auto_reset_persistent` integer

  깨어진 pg_pconnect() 지속 연결의 검출. 약간의 오버헤드가 필요합니다.

`pgsql.ignore_notice` integer

  PostgreSQL 백엔드 경고의 무시 여부.

`pgsql.log_notice` integer

  PostgreSQL 백엔드 경고 메세지의 기록 여부. 경고 메세지를 기록하기 위해서는 PHP 지시어 pgsql.ignore_notice를 off로 설정해야만 합니다.

# 사용법과 힌트

주의
PostgreSQL 모듈을 PHP 4.0.6과 함께 사용하는 것은 경고 메세지 핸들링의 버그로 인해 권장하지 않습니다. 4.1.0 이상을 사용하십시오.

주의

PostgreSQL 함수 이름은 현재 코딩 표준을 지키기 위해서 4.2.0 릴리즈부터 변경되었습니다. 대부분의 새 이름은 pg_lo_poen()과 같이 언더스코어가 추가되었습니다. 몇몇 함수는 일관성을 위해 pg_exec()에서 pg_query()와 같이 다른 이름으로 변경되었습니다. 옛 이름은 4.2.0과 이후의 몇몇 릴리즈에서는 사용할 수 있을 것이지만, 차후에 삭제될 것입니다.

표 2. 함수 이름 변경

옛 이름 | 새 이름
--- | ---
pg_cmdtuples() | pg_affected_rows()
pg_errormessage() | pg_last_error()
pg_exec() | pg_query()
pg_fieldname() | pg_field_name()
pg_fieldsize() | pg_field_size()
pg_fieldnum() | pg_field_num()
pg_fieldprtlen() | pg_field_prtlen()
pg_fieldisnull() | pg_field_is_null()
pg_freeresult() | pg_free_result()
pg_getlastoid() | pg_last_oid()
pg_loreadall() | pg_lo_read_all()
pg_locreate() | pg_lo_create()
pg_lounlink() | pg_lo_unlink()
pg_loopen() | pg_lo_open()
pg_loclose() | pg_lo_close()
pg_loread() | pg_lo_read()
pg_lowrite() | pg_lo_write()
pg_loimport() | pg_lo_import()
pg_loexport() | pg_lo_export()
pg_numrows() | pg_num_rows()
pg_numfields() | pg_num_fields()
pg_result() | pg_fetch_result()

이전의 pg_connect()/pg_pconnect() 구문은 차후에 비동기 접속을 지원하기 위해서 배제되어집니다. pg_connect()과 pg_pconnect()을 위한 접속 문자열을 사용하시기 바랍니다.

모든 빌드에서 모든 함수가 지원되는 것은 아닙니다. libpq (PostgreSQL C 클라이언트 인터페이스) 버전과 어떻게 컴파일하였는가에 의존합니다. 빠진 함수가 존재하면, libpq가 그 함수에 필요한 기능을 제공하지 않는 것입니다.

접속하려는 PostgreSQL 서버보다 오래된 libpq를 사용하지 않아야만 합니다. PostgreSQL 서버가 요구하는 것보다 오래된 libpq를 사용하면, 문제가 발생할 수 있습니다.

버전 6.3 (1998/03/02)부터 PostgreSQL은 기본값으로 유닉스 도메인 소켓을 사용합니다. 기본값으로 TCP 포트는 열지 않습니다. 아래의 표는 이 새로운 접속의 허용을 나타냅니다. 이 소켓은 `/tmp/.s.PGSQL.5432`에서 발견할 수 있습니다. postmaster에 "유닉스 도메인 소켓과 함께 TCP/IP 소켓을 리슨하라"는 의미의 '-i' 플래그를 지정하여 이 옵션을 활성화 할 수 있습니다.

표 3. Postmaster와 PHP

Postmaster | PHP | 상태
--- | --- | ---
postmaster & | pg_connect("dbname=MyDbName"); | OK
postmaster -i & | pg_connect("dbname=MyDbName"); | OK
postmaster & | pg_connect("host=localhost dbname=MyDbName"); | Unable to connect to PostgreSQL server: connectDB() failed: Is the postmaster running and accepting TCP/IP (with -i) connection at 'localhost' on port '5432'? in /path/to/file.php on line 20.
postmaster -i & | pg_connect("host=localhost dbname=MyDbName"); | OK

PostgreSQL 서버에 접속은 명령 문자열에 다음의 값들을 지정해서 이루어집니다: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ");

이전의 구문: $conn = pg_connect ("host", "port", "options", "tty", "dbname") 은 배제되었습니다.

환경 변수가 PostgreSQL 서버/클라이언트 동작에 영향을 줍니다. 예를 들면, PostgreSQL 모듈은 접속 문자열에 hostname이 빠져 있으면 PGHOST 환경 변수를 찾아봅니다. 지원하는 환경 변수는 버전에 따라 다릅니다. 자세한 내용은 PostgreSQL 프로그래머 매뉴얼 (libpq - 환경 변수)를 참고하십시오.

적절한 유저로 환경 변수를 지정하였는지 확인하십시오. 현재 프로세스가 어떤 환경 변수를 사용할 수 있는지 확인하려면 `$_ENV`나 getenv()를 사용하십시오.

예 1. 기본 파라메터 설정하기

    PGHOST=pgsql.example.com
    PGPORT=7890
    PGDATABASE=web-system
    PGUSER=web-user
    PGPASSWORD=secret
    PGDATESTYLE=ISO
    PGTZ=JST
    PGCLIENTENCODING=EUC-JP

    export PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD PGDATESTYLE PGTZ PGCLIENTENCODING

# 상수 정의

이 확장 모듈은 다음의 상수를 정의합니다. 이는 확장 모듈을 PHP에 내장했거나, 실행시에 동적으로 읽어들일 경우에만 사용할 수 있습니다.

`PGSQL_ASSOC` (integer)

`PGSQL_NUM` (integer)

`PGSQL_BOTH` (integer)

`PGSQL_CONNECTION_BAD` (integer)

`PGSQL_CONNECTION_OK` (integer)

`PGSQL_SEEK_SET` (integer)

`PGSQL_SEEK_CUR` (integer)

`PGSQL_SEEK_END` (integer)

`PGSQL_ESCAPE_STRING` (integer)

`PGSQL_ESCAPE_BYTEA` (integer)

`PGSQL_EMPTY_QUERY` (integer)

`PGSQL_COMMAND_OK` (integer)

`PGSQL_TUPLES_OK` (integer)

`PGSQL_COPY_OUT` (integer)

`PGSQL_COPY_IN` (integer)

`PGSQL_BAD_RESPONSE` (integer)

`PGSQL_NONFATAL_ERROR` (integer)

`PGSQL_FATAL_ERROR` (integer)

# 예제

PostgreSQL 7.1.0부터, text 타입의 필드에 1GB까지 저장할 수 있습니다. 이전 버전에서는, 블록 사이즈(기본값은 8KN, 최대값은 32KB, 컴파일 시에 지정)으로 제한되었었습니다.

대형 객체 (lo) 인터페이스를 사용하려면, 트랜젝션 블록에 대형 객체 함수를 포함할 필요가 있습니다. 트랜젝션 블록은 SQL 구문 BEGIN로 시작하고, 트랜젝션이 유효하다면 COMMIT나 END로 종료합니다. 트랜젝션이 실패하면 트랜젝션은 ROLLBACK이나 ABORT로 닫아야만 합니다.

예 2. 대형 객체 사용하지

`<?php $database = pg_connect("dbname=jacarta"); pg_query($database, "begin"); $oid = pg_lo_create($database); echo "$oid\n"; $handle = pg_lo_open($database, $oid, "w"); echo "$handle\n"; pg_lo_write($handle, "large object data"); pg_lo_close($handle); pg_query($database, "commit"); ?>`

대형 객체를 닫기 전에 PostgreSQL 서버와의 접속을 끊어서는 안됩니다.

이전 | 처음으로 | 다음
posix_uname | 위로 | pg_affected_rows