MongoDB 관리자 패스워드 초기화

리눅스/MongoDB|2019. 4. 16. 14:01
반응형

MongoDB root 패스워드 초기화 방법입니다.

DB shell 로그인하기 위해 기본적으로는 패스워드를 입력하게 되어 있습니다.

하지만 유사시 패스워드 없이 로그인 하는 방법이 있습니다.

 

MongoDB 3.4.20

 

# vi /etc/mongod.conf

// 인증없이 로그인 가능하도록 2줄 주석 처리

#security:
#  authorization: enabled

 

# systemctl restart mongod

 

# mongo

 

> use admin

 

계정 리스트 출력시켜 관리자 계정 확인하기 (admin 데이터베이스에 액세스 가능한 계정)

> db.system.users.find()

 

패스워드 변경

> db.changeUserPassword("계정명", "새비밀번호")

 

/etc/mongod.conf 파일에 주석처리 해놓은 부분을 다시 주석 해제 후

 

# systemctl restart mongod

 

로그인이 잘 되는지 확인합니다.

 

# mongo admin -u 계정명 -p 새비밀번호

 

 

 

반응형

댓글()

CentOS 7 에 MongoDB 3.4.20 설치, 기본 명령어, 동기화(복제구성 & Replica set) - 동기화부분 작성중

리눅스/MongoDB|2019. 4. 16. 10:21
반응형

CentOS 8 버전 MongoDB 4.4.1 설치하는 방법은 아래 URL 을 참고하세요~

https://www.howtoforge.com/tutorial/centos-mongodb/

 

 

1. 설치 및 구동

 

MongoDB 는 CentOS 7 의 기본 리포지토리에 등록되어 있지 않기 때문에

별도의 리포지토리 등록 후 설치를 진행해야 합니다.

 

# vi /etc/yum.repos.d/mongodb-org.repo

[mongodb-org-3.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

 

# yum -y install mongodb-org

 

# systemctl enable mongod

 

# systemctl start mongod

 

* 설정 파일 : /etc/mongod.conf

* 로그 파일 : /var/log/mongodb/mongod.log

 

 

2. 기본 명령어

 

MongoDB 로그인

# mongo

 

========================

 

관리자 계정 생성

> use admin

 

> db.createUser({user: "sysdocu", pwd: "12345678", roles:["root"]})

// 계정명 sysdocu 를 관리자로 등록 (보통은 root 나 admin 를 많이 사용합니다)

// root 라는 roles 은 MongoDB 상 최고의 권한이다.

// (roles 종류 : https://docs.mongodb.com/manual/reference/built-in-roles/)

 

이제 최고 권한 계정으로 작업을 한다.

> exit

 

# mongo admin -u sysdocu -p

 

일반 계정 생성 및 DB 접근 설정

> use test    // access 하려는 DB를 선택 후 계정을 생성해야 한다. ★

 

> db.createUser({user: "sysdocu", pwd: "12345678", roles: [{ role: "readWrite", db: "test" }] })
// 계정명 : sysdocu, 패스워드 : 12345678, 권한 : 읽고 쓰기, 접근 DB : test

 

계정 리스트 보기 (DB 를 선택 한 상태에서)

> show users

 

계정 삭제

> db.dropUser("sysdocu")

 

로컬 접속
# mongo admin -u sysdocu -p '12345678'    // admin DB를 선택하며 로그인 (제외시 로그인 안됨)

// ! 느낌표가 들어간 패스워드일 경우엔 " 말고 ' 를 사용 해야 함

 

원격 접속

# mongo -u sysdocu -p 12345678 10.2.0.5/admin    // 10.2.0.5 번 서버의 admin 디비에 접근

 

========================

 

데이터베이스 생성

> use test    // 생성할 데이터베이스명 입력 (여기까지만 하면 생성이 되지 않음)

> db.createCollection("members")    // members 컬렉션을 옵션없이 생성. 컬렉션이 생성되면 이때 데이터베이스도 같이 생성됨

 

* 테이블을 MongoDB 에서는 컬렉션으로 부릅니다.

* 레코드를 MongoDB 에서는 도큐멘트라고 부릅니다.

 

컬렉션이 없는 상태에서 도큐멘트를 insert 하면 컬렉션이 자동으로 생성되기도 합니다.

> db.members.insert({"name": "sysdocu"})

> db.members.insert({"name": "superman"})

 

도큐멘트 삭제

db.members.remove({"name": "superman"})

 

데이터베이스 리스트 확인

> show dbs

 

컬렉션 (테이블) 리스트 확인

> show collections

 

컬렉션 내용 확인

> db.members.find()

 

도큐멘트 개수 확인

db.members.count()

 

도큐멘트 모두 삭제

> db.members.remove({})

 

컬렉션 (테이블) 삭제

> db.members.drop()

 

데이터베이스 삭제 (use 라는 명령으로 데이터베이스가 선택 된 상태에서)

> db.dropDatabase()

 

데이터베이스 복사

> db.copyDatabase('test', 'testTWO')

 

 

3. 백업 및 복구

 

* MongoDB 외부 접근 허용

# vi /etc/mongod.conf

bindIp: 0.0.0.0    // 기존 127.0.0.1 를 0.0.0.0 으로 수정

 

(백업 서버에서 작업할 경우)

 

1) 원본 MongoDB 서버의 특정 데이터베이스를 복사해오는 방법

> db.copyDatabase("test", "test", "49.247.131.228")    // 원격지 서버의 test DB를 복제

 

2) 원본 MongoDB 서버의 모든 데이터베이스를 복사해오는 방법

> db.cloneDatabase("49.247.131.228")    // 원격지 서버의 모든 DB를 복제

 

(원본 서버에서 작업할 경우)

 

1) 모든 데이터베이스 dump

# mongodump --out ./backup --host 127.0.0.1 --port 27017 -u계정명 -p계정비번

// 현재 디렉토리에 backup 이라는 디렉토리를 생성하고 그 안에 dump 파일을 생성

 

2) 특정 데이터베이스 dump

# mongodump --out ./backup --host 127.0.0.1 --port 27017 -u계정명 -p비번 --db test

// 현재 디렉토리에 backup 이라는 디렉토리를 생성하고 그 안에 dump 파일을 생성

 

3) 데이터베이스 복구

# mongorestore -u 계정명 -p 비번 --drop --db test ./backup/test/

// --drop 은 기존 데이터 지우고 복구 하라는 뜻

 

* 간단하게 하려면 (전체 백업, 복구)

# mongodump --host 127.0.0.1

// 실행 시 dump 라는 디렉토리가 생기고 jon 형태로 데이터가 추출된것이 확인 됩니다.

 

# mongorestore -h 127.0.0.1 ~/dump/

 

 

4. 동기화 (복제 설정 & replica set) 설정

 

복제 방식에는 두 가지가 있습니다.

쉘 명령을 통한 복제 설정과 replica set 이 있는데,

복제 구성은 설정이 간편한 장점이 있으나, 5초 단위로 데이터가 동기화 됩니다.

replica set 은 마스터 포함 최대 6대 까지 실시간 동기화가 가능하나, 몇가지 설정 작업이 필요합니다.

두가지 방식 모두는 단방향 통신이기 때문에 마스터 서버는 읽고 쓰기, 슬레이브 서버에서는 읽기만 됩니다.

 

 

1) replica set 설정

 

MongoDB 를 한 번만 재시작 하기 위해 MongoDB 키 파일을 먼저 생성해줍니다.

 

(마스터 서버에서)

# openssl rand -base64 741 > /etc/mongod.key

# chmod 600 /etc/mongod.key

 

슬레이브 서버로 key 파일을 복사해줍니다.

# scp /etc/mongod.key root@49.247.232.10:/etc/

 

(모든 서버에서)

# vi /etc/mongod.conf

security:
  keyFile: /etc/mongod.key

replication:

  replSetName: "ABC"    // 그룹명은 아무거나 입력

 

# systemctl restart mongod

 

(마스터 서버에서)

# mongo

> rs.initiate( {
   _id : "ABC",
   members: [
      { _id: 0, host: "49.247.131.228:27017" },
      { _id: 1, host: "49.247.132.10:27017" }
   ]
})

 

* 위와 같이 실행했을때 아래와 같은 에러 메세지가 출력된다면, 한 번에 명령을 실행하지 말고 나누어 실행하면 됩니다.

"errmsg" : "'49.247.132.10:27017' has data already, cannot initiate set."

 

> rs.initiate( {
   _id : "ABC",
   members: [
      { _id: 0, host: "49.247.131.228:27017" }
   ]
})

> rs.add("49.247.132.10:27017")

 

동기화 테스트를 해봅니다.

 

2) 복제 구성

 

(마스터 서버에서)

# systemctl stop mongod

# mongod --dbpath /var/lib/mongo -port 27017 -master &    // 실제 데이터 디렉토리 (데이터가 초기화 됨)

 

(슬레이브 서버에서)

# systemctl stop mongod

# mongod --dbpath /var/lib/mongo -port 27017 -slave -source 49.247.131.228:27017 &    // 실제 데이터 디렉토리와 마스터 서버 정보

 

# mongo

> rs.slaveOk()    // 동기화 시작

 

>>> 잘 안됨

 

5. 복제 도구

https://github.com/sheharyarn/mongo-sync

mongo-sync.zip
0.00MB

명령을 실행할 한 쪽 서버에서만 다운로드 받으면 됩니다.

파일압축을 풀면 3개의 파일이 나옵니다.

 

1) config.yml 파일을 열어 설정을 마친 뒤 아래와 같이 동기화 합니다.
2) ./mongo-sync push  // 상대 서버로 밀어내기

     ./mongo-sync pull    // 명령을 내리는 서버로 가져오기

3) 명령행 뒤에 -y 를 주게 되면 확인 메세지 건너뜀

 

<동기화 조건>

- DB 및 접근 계정을 미리 생성해 놔야 함

- 테이블은 있으나 없으나 상관없음. 새로 덮어 씌우기가 됨

 

★ log 데이터베이스를 당겨 올때..
/tmp 에 덤프파일이 생성 되므로 해당 파티션에 용량이 부족하다면 아래와 같이 링크를 미리 생성해놓고
용량이 큰쪽에 생성 될 수 있도록 합니다.
덤프 받는 중에는 원하는 파티션으로 데이터가 생성되는지 확인 해야 합니다.

# mkdir /log1/mirror_tmp
# ln -s /log1/mirror_tmp /tmp/log    // 임시 파일 디렉토리에 작업 DB명이 생성됩니다.

 

반응형

댓글()

변수에 숫자만 있는지 확인

프로그래밍/BASH SHELL|2019. 4. 5. 09:46
반응형

# vi no.sh

#!/bin/bash
v=$1
if [ $v -eq $v 2> /dev/null ]; then
   echo $v is a number
else
   echo $v isnt a number
fi

 

사용법

# sh no.sh 123

반응형

댓글()

쉘스크립트 include 하기

프로그래밍/BASH SHELL|2019. 4. 5. 08:46
반응형

php 의 include 함수와 같이 쉘스크립트에서 외부의 파일을 가져와 적용하기 위해서는 아래와 같은 코드로 작성한다.

 

. ./other.sh

 

 

반응형

댓글()

FOPEN, 파일 읽고 쓰기, 첨부하기의 스펙과 예제

프로그래밍/PHP|2019. 4. 2. 09:11
반응형

* PHP에서 파일을 읽는 fopen 기능에 대해서 알아보자.


* fopen 포맷

resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )


: 인자를 총 4개 받으며, 1, 2번째 인자는 필수고 3, 4번째 인자는 옵션이다.


* 첫번째 인자: string $filename

: 파일을 로드할 파일명으로, 앞에 "scheme://..."와 같은 프로토콜을 명시하는 경우 해당하는 프로토콜을 이용하는 URL로 판별하여 해당 scheme의 프로토콜 핸들러를 찾아서 파일에 접근하게 된다. 만약 프로토콜이 명시되지 않았다면 서버 로컬의 일반적인 파일로 판단하여 찾게 된다. 만약 로컬의 파일로 판단하게 되면, 파일내용을 stream으로 열게 된다. php.ini에 safe_mode나 open_basedir를 설정하게 되면 fopen에 기본적으로 적용하게 된다.

: 만약 첫번째 인자를 URL로 판단하게 된다면, PHP는 php.ini파일의 allow_url_fopen이 활성화 되었는지 보고, 만약 false로 설정되어있다면 경고와 함께 fopen은 실행되지 않을 것이다.


- 참고로 PHP에서 위의 URL로 판단하는 scheme의 핸들러가 있는 목록은 다음과 같다.

    • file:// - 로컬 파일 시스템 접근
    • http:// - http url
    • ftp:// - ftp url
    • php:// - 다양한 I/O stream
    • zlib:// - 압축된 stream
    • data:// - 데이터 (RFC 2397)
    • glob:// - 패턴에 맞는 경로이름을 검색
    • phar:// - PHP archive
    • ssh2:// - Secure SHell 2
    • rar:// - rar
    • ogg:// - audio stream
    • expect:// Process Interaction Streams

- 주의: 윈도우 플랫폼에서는 백슬래쉬는 2개를 사용해야한다.

<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>


* 두번째 인자: string $mode

: 어떠한 모드로 파일을 열 것인지 설정하는 인자. 각 인자는 아래와 같다.



인자 

모드 

포인터 위치 

파일이 존재 유무 

 r

 읽기 전용  파일의 시작 

 파일 내용 보존

 r+

 읽고 쓰기

 파일의 시작

 파일 내용 보존

 w

 쓰기 전용 파일의 시작 파일 내용 삭제, 없으면 새로 생성

 w+

 읽고 쓰기 파일의 시작 파일 내용 삭제, 없으면 새로 생성

 a

 쓰기 전용

 파일의 끝 파일 내용 보존, 없으면 새로 생성

 a+

 읽고 쓰기 파일의 끝 파일 내용 보존, 없으면 새로 생성

 x

 쓰기 전용 새로운 파일 생성

파일이 존재하면 false 리턴 그리고 에러 남 

 x+

 읽고 쓰기

 새로운 파일 생성

파일이 존재하면 false 리턴 그리고 에러 남  


- 위의 모드 인자뒤에 마지막에 b나 t를 붙일 수 있다.

    • b: 바이너리모드로 호출
    • t: 텍스트 파일의 라인 변경 태그를 Unix에서는 \n를 사용하고, 맥에서는 \r만 사용하는데 윈도우에서는 \r\n를 사용하는데, 이러한 \n을 \r\n으로 변환해준다. 따라서 다른 시스템의 텍스트 파일을 윈도우 플랫폼에서 열 때 사용하면 좋다.


* 세번째 인자: bool $use_include_path = false

: 3번째 인자는 옵션으로 기본 값이 false로 설정되어있다. true나 1로 설정하게 되면, php.ini에 설정되어있는 include_path의 경로도 같이 검색을 하게 된다.


* 네번째 인자: resource $context

: 4번째 인자는 PHP 5.0이후에 추가되었으며, 파일 핸들러에서 다룰 컨텍스트를 지정해주는 인자이다. context 설정은 아래와 같이 사용될 수 있다.

<?php
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);

$context = stream_context_create($opts);

/* Sends an http request to www.example.com
   with additional headers shown above */
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
?>



* 파일 읽고 쓰는 함수들

: 파일을 읽고 쓰거나 특정 위치로 갈때에는 다음 함수들을 사용하면 된다.

string fgets ( resource $handle [, int $length ] ); //한 줄을 읽은, default 최대 length는 1024

string fread ( resource $handle , int $length ); // length 바이트를 읽음 (바이너리 모드일 때 사용)

int fwrite ( resource $handle , string $string [, int $length ] ); // 바이너리로 파일에 씀

int ftell ( resource $handle ); // 현재 핸들러의 위치를 리턴

int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] ); //핸들러의 해당 위치로 이동


* 파일 닫기

: 파일을 다 쓰고 읽고 나면 최종적으로는 반드시 파일을 닫아줘야한다.

bool fclose ( resource $handle ); // 핸들러를 닫는다.



* 파일 읽고 쓰기 예제

<?PHP

//일반적인 파일 읽기 사용 예
$file_handle = fopen("myFile.txt", "r");

while (!feof($file_handle)) {

$line_of_text = fgets($file_handle);
print $line_of_text . "
"; } fclose($file_handle); ?>
//기존의 파일 뒤에 첨부하여 쓰기
$fh = fopen("testFile.txt", 'a') or die("can't open file");
fwrite($fh, "New Stuff 1\n");
fwrite($fh, "New Stuff 2\n");
fclose($fh);

//파일 5글자 읽기
$fh = fopen("testFile.txt", 'r');
echo fread($fh, 5);
fclose($fh);

//한 라인 읽기
$fh = fopen("testFile.txt", 'r');
echo fgets($fh);
fclose($fh);

// 40번째 바이트로 간다음 240바이트를 읽어서 출력하기
$fh = fopen("testFile.txt", 'r');
fseek($file,40);
echo fread($file,240);


* 끝



출처: https://unikys.tistory.com/273 [All-round programmer]




반응형

댓글()

NFS 간단 설정 방법 - CentOS, Rocky Linux, Ubuntu

리눅스/OS 일반|2019. 3. 28. 08:32
반응형

* 방화벽은 내려져 있다는 가정하에 진행합니다.

* 테스트에 사용된 IP 입니다.

   - 192.168.10.2 : NFS 서버

   - 192.168.10.3 : NFS 클라이언트

 

 

1. 서버에서

 

1) 설치

CentOS

[root@sysdocu ~]# yum -y update

[root@sysdocu ~]# yum -y install nfs-utils nfs-utils-lib

Rocky

[root@sysdocu ~]# dnf -y update

[root@sysdocu ~]# dnf -y install nfs-utils

Ubuntu

[root@sysdocu ~]# apt-get -y update

[root@sysdocu ~]# apt-get -y install nfs-kernel-server

 

2) 공유 디렉토리 생성

[root@sysdocu ~]# mkdir /data

 

3) 클라이언트 접근 설정

[root@sysdocu ~]# vi /etc/exports

/data 192.168.10.3(rw,no_root_squash)

/data 192.168.10.4(rw,no_root_squash)     // 아이피를 추가하거나

/data 192.168.10.0/24(rw,no_root_squash) // 대역 추가 가능

 

* 옵션 설명

ro - 읽기 전용

rw - 읽기와 쓰기 모두 가능

no_root_squash - 기본적으로 NFS 클라이언트에서 루트 사용자가 공유된 디렉토리를 사용한다 하여도

                              접근 사용자는 nfsnobody 권한을 갖는다. 이때 이 옵션 사용시 클라이언트의 루트와

                              서버의 루트 권한을 갖게 된다.(클라이언트에게 root 권한 부여)

root_squash - 클라이언트에게 nfsnobody 권한을 갖도록 설정

sync - 클라이언트가 파일 쓰기 완료 후 디스크 동기화를 진행

noaccess - 디렉토리를 접근하지 못하게 막음

insecure - 암호 인증을 하지 않음

 

4) 서비스 구동 및 자동 구동 설정

CentOS

[root@sysdocu ~]# systemctl enable --now nfs

Rocky

[root@sysdocu ~]# systemctl enable --now nfs-server

Ubuntu

[root@sysdocu ~]# systemctl enable --now nfs-kernel-server

 

이미 가동중인 데몬은 systemctl restart 명령을 한 번 더 수행해야 설정이 적용됩니다.

# systemctl restart {OS에 맞는 데몬 이름}

 

 

2. 클라이언트에서

 

1) 마운트 패키지 설치

CentOS

[root@sysdocu ~]# yum -y install nfs-utils

Rocky

[root@sysdocu ~]# yum -y install nfs-utils

Ubuntu

[root@sysdocu ~]# apt-get -y install nfs-common

 

2) 마운트 디렉토리 생성

[root@sysdocu ~]# mkdir /data

 

3) 마운트

[root@sysdocu ~]# mount -t nfs 192.168.10.2:/data /data

 

4) 부팅시 자동 구동 설정

[root@sysdocu ~]# vi /etc/fstab

192.168.10.2:/data /data nfs rw 0 0

 

 

반응형

댓글()

CentOS 7 커널 순서 변경

리눅스/OS 일반|2019. 3. 22. 11:37
반응형

현재 설치된 커널 리스트 확인

[root@sysdocu ~]# grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2

CentOS Linux (3.10.0-862.14.4.el7.x86_64) 7 (Core)

CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)    // 부팅시 이 커널로 부팅을 원함

CentOS Linux (0-rescue-c756677fe54f42069209a95c5e539caa) 7 (Core)



현재 기본 부팅되는 커널

[root@sysdocu ~]# grub2-editenv list

saved_entry=CentOS Linux (3.10.0-862.14.4.el7.x86_64) 7 (Core)



원하는 커널로 부팅설정 하기

[root@sysdocu ~]# grub2-set-default "CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)"



현재 기본 부팅되는 커널 (재확인)

[root@sysdocu ~]# grub2-editenv list

saved_entry=CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)     // 변경된 것 확인 되었음



반응형

댓글()

iptables 중지되지 않을때

리눅스/Network|2019. 3. 18. 14:21
반응형

아래 명령의 파일을 생성하여 일괄 처리합니다.

 

iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
iptables -t security -F
iptables -Z
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

 

반응형

댓글()

차트 (chart) 사용하기

프로그래밍/PHP|2019. 3. 15. 10:42
반응형

https://www.amcharts.com



반응형

댓글()

nc 명령어 (포트 체크)

리눅스/Network|2019. 3. 7. 08:36
반응형

nc 명령으로 포트가 열렸는지 빠르게 (예시에서는 0.01 초) 확인이 가능하다.


root@sysdocu:~# nc -z -v 192.168.10.2 21

Ncat: Version 7.50 ( https://nmap.org/ncat )

Ncat: Connected to 115.68.221.85:21.

Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.



root@sysdocu:~# nc -z -v 192.168.10.2 22

Ncat: Version 7.50 ( https://nmap.org/ncat )

Ncat: Connection refused.



반응형

댓글()

php 5.2.17 소스 컴파일시 오류 (node.c: In function 'dom_canonicalization')

리눅스/PHP|2019. 2. 13. 16:02
반응형

php 소스 컴파일시 아래와 같은 오류가 발생하는 경우가 있다. 


gcc 4.7 버전에서 아래와 같은 오류가 발생한다. 


/home/segio_php/php-5.2.17/ext/dom/node.c: In function ‘dom_canonicalization’:

/home/segio_php/php-5.2.17/ext/dom/node.c:1953:21: error: dereferencing pointer to incomplete type

/home/segio_php/php-5.2.17/ext/dom/node.c:1955:5: error: dereferencing pointer to incomplete type



이때는 아래와 같은 순서로 php 소스를 패치하면 오류가 사라진다. 


(소스 디렉토리에서)

# wget -O php.patch  https://mail.gnome.org/archives/xml/2012-August/txtbgxGXAvz4N.txt

# patch -p0 -b < php.patch

patching file ext/dom/node.c

Hunk #1 succeeded at 1950 (offset 55 lines).

patching file ext/dom/documenttype.c

Hunk #1 succeeded at 215 (offset 10 lines).

patching file ext/simplexml/simplexml.c

Hunk #1 succeeded at 1343 (offset -74 lines).


patch 명령어를 찾을 수 없다고 할 경우 yum -y install patch


위와 같이 패치를 적용한 후 컴파일을 하면 문제없이 진행된다. 


[출처] http://blog.naver.com/ssik425/10175143994



===================== php.patch 내용 ====================

--- ext/dom/node.c	2012-08-06 17:49:48.826716692 +0800
+++ ext/dom/node.c	2012-08-06 17:52:47.633484660 +0800
@@ -1895,9 +1895,17 @@ static void dom_canonicalization(INTERNA
         RETVAL_FALSE;
     } else {
 		if (mode == 0) {
+#ifdef LIBXML2_NEW_BUFFER
+            ret = xmlOutputBufferGetSize(buf);
+#else
 			ret = buf->buffer->use;
+#endif
 			if (ret > 0) {
+#ifdef LIBXML2_NEW_BUFFER
+                RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
+#else
 				RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
+#endif
 			} else {
 				RETVAL_EMPTY_STRING();
 			}
--- ext/dom/documenttype.c	2012-08-06 18:02:16.019640870 +0800
+++ ext/dom/documenttype.c	2012-08-06 18:06:16.612228905 +0800
@@ -205,7 +205,13 @@ int dom_documenttype_internal_subset_rea
 		if (buff != NULL) {
 			xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
 			xmlOutputBufferFlush(buff);
+
+#ifdef LIBXML2_NEW_BUFFER
+			ZVAL_STRINGL(*retval, xmlOutputBufferGetContent(buff),
+			             xmlOutputBufferGetSize(buff), 1);
+#else
 			ZVAL_STRINGL(*retval, buff->buffer->content, buff->buffer->use, 1);
+#endif
 			(void)xmlOutputBufferClose(buff);
 			return SUCCESS;
 		}
--- ext/simplexml/simplexml.c	2012-08-06 18:10:44.621017026 +0800
+++ ext/simplexml/simplexml.c	2012-08-06 18:12:48.016270419 +0800
@@ -1417,7 +1417,12 @@ SXE_METHOD(asXML)
 
 			xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, ((xmlDocPtr) sxe->document->ptr)->encoding);
 			xmlOutputBufferFlush(outbuf);
+#ifdef LIBXML2_NEW_BUFFER
+			RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf),
+			               xmlOutputBufferGetSize(outbuf), 1);
+#else
 			RETVAL_STRINGL((char *)outbuf->buffer->content, outbuf->buffer->use, 1);
+#endif
 			xmlOutputBufferClose(outbuf);
 		}
 	} else {

======================================================




반응형

댓글()