php를 이용한 DB접속
DB에 접속하기 전에 ID, PW, tns이름은 알고있어야 한다.
실습에서는 Oracle만 사용할 것이기 때문에 MySQL연동은 하지 않는다.
DB접속, SQL생성, SQL 구문 파싱, SQL 구문 실행은 소스가 Oracle이든 MySQL이든 DB구축시 동일하다.
오라클 |
클라이언트 |
sqlplus php/php@oracle |
php |
$conn=oci_connect("php", "php", "oracle"); |
SQL문을 실행하기전에 1.SQL문의 오타확인, 2. 테이블이나 컬럼이 있는지 확인, 3. 실행계획수립의 과정을 수행하는 파싱과정을 실행한다. 그 후 실행계획에 따라 SQL문을 수행한다.
결과 패치와 접속종료는 DB마다 다를 수 있다. SQL문중 SELECT문이라면 검색된 결과가 리소스형태로 변수에 전달되어 사용자가 직접 확인할수없다. 따라서 사용자가 볼수있게 리소스형태의 정보를 변수로 옮기는 과정이 필요한데 이것을 패치라고 한다. 결과 패치는 Oracle도 MySQL도 엄청 다양한데 Oracle에서 주로 사용하는 것은 oci_fetch_array와 oci-fetch_all가 있지만 둘둥 하나만 사용한다. MySQL에서는 mysql_fetch_row, mysql_fetch_array가 있다.
접속 종료는 접속을 종료하고 프로그램을 끝내는 과정이다.
오라클에서의 직접접속, php를 이용한 간접접속
직접접속은 two tier라고 하며 userprocess와 serverprocess가 통신하는 방식이고 간접접속은 three tier라고 하며 web이 userprocess를 통해 serverprocess로 접속하는 것을 말한다.
간접접속이 web이 변해도 DB에 접속이 가능하기 때문에 생산성이 높아 근래에 많이 사용된다.
서버프로세서는 과거 프로토콜이 너무 다양했었기 때문에 리스닝을 할수없었다. 따라서 유저 프로세서가 서버 프로세서에 접근하기 위해서는 유저프로세서에서 리스너로 통신하고 리스너는 서버프로세서로 통신한다. 그 후 응답을 서버 프로세서가 유저프로세서로 보내는 것이다.
SID는 인스턴스 명으로 보통은 DB명을 사용하지만 컨테이너 DB등의 다중 DB서버는 SID와 DB명이 다를 수 있다.
resource oci_connect ( string $username , string $password [, string $connection_string [,
string $character_set [, int $session_mode ]]] ) 중에서 string $username , string $password , string $connection_string는 필수이다.
실습 1 TNS명을 사용해서 접속한 화면과 TNS명을 사용하지 않고 접속한 화면 출력
이전글 : Day 28 (oracle & apache & php)
이전 서버 구축을 완료하지 못했기 때문에 이어서 수행했다.
지속적인 index.html문제가 발생해서 해결되지 않았다.
각 라인 출력하며 확인한 결과 @oci_connect부분있는 라인부터 실행안됨되는 것을 확인했다.
php를 컴파일할때 ./configure --with-apxs2=/app/apache/bin/apxs --with-oci8=/app/ora12c/12c --enable-sigchild를 입력했기 때문에 oci명령어 동작이 안된다고 판단하여 재적용 시켰으나 증상이 동일하였다.
따라서 oci파일을 직접 설치를 시도했다.
그러나 개발 모듈이 아니기 때문에 적용이 불가능했다.
기존의 시스템에서 설정이 잘못된것이 있는지 다시 한번 확인 하던중 /app/apache/bin/apachectl파일안에 명령어 실행 부분이 configuration section전에 실행되야 적용된다고 판단하여 명령어 실행부분을 configuration section 앞쪽에 적용했다.
php연동이 확인 되었으나 연결에 실패했다.
설정 적용이 안되었다고 생각되어 reboot후 apache서버를 재시동할때 /app/apache/bin/apachectl restart하지 않고 /app/apache/bin/apachectl stop후 /app/apache/bin/apachectl start를 적용시켰더니 연결되었다.
재부팅시 지속적인 포트사용으로 연결이 되지 않아 연결 포트를 TCP가 사용중이라고 출력되었다. 사용중인 프로세스를 출력해보니 reboot직후에는 아무런 프로세스도 없었다. 좀비프로세서라고 판단하고 계속해서 지웠다. 이에 대한 해결방법도 찾아봐야 할것이다.
'교육 > Php' 카테고리의 다른 글
Day 32(Php + Oracle) (0) | 2020.01.02 |
---|---|
Day 31 (php + DB) (0) | 2019.12.31 |
Day 30 (php) (0) | 2019.12.30 |
Day 29(php) (0) | 2019.12.27 |
Day 28 (php) (0) | 2019.12.26 |