php 는 어떻게 PDO 로 빅 데이터 대상 을 조작 합 니까?

빅 데이터 대상 이란 무엇 인가
'대'는 보통'약 4kb 이상'을 의미한다.비록 일부 데이터 베 이 스 는 데이터 가'대'에 이 르 기 전에 32kb 에 달 하 는 데 이 터 를 쉽게 처리 할 수 있 지만.대상 은 본질 적 으로 텍스트 나 바 이 너 리 형식 일 수 있 습 니 다.우 리 는 PDOStatement:bidParam()또는 PDOStatement::bidColumn()호출 에서 PDO::PARAM 을 사용 합 니 다.LOB 타 입 코드 는 PDO 가 빅 데이터 타 입 을 사용 할 수 있 도록 합 니 다.PDO::PARAM_LOB 는 PHP Streams API 를 사용 할 수 있 도록 PDO 에 게 흐름 으로 데 이 터 를 매 핑 하 라 고 알려 주 었 다.
MySQL 의 경우 필드 형식 을 blob 즉 대상 형식의 필드 로 설정 합 니 다.bindParam()또는 bindColumn()에서 지정 한 필드 의 인 자 는 PDO::PARAM 입 니 다.LOB 타 입 은 fopen()처럼 이 대상 의 내용 을 문형 으로 직접 얻 을 수 있 습 니 다.

CREATE TABLE `zy_blob` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `attach` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
이것 은 우리 가 테스트 하 는 데이터 시트 입 니 다.attach 필드 를 longbrob 형식,즉 비교적 큰 blob 형식 으로 설정 하면 우 리 는 더 많은 정 보 를 저장 할 수 있 습 니 다.현재 의 그림 이나 파일 은 마음대로 몇 m 또는 몇 십 m 로 시작 되 기 때문에 우 리 는 가장 큰 blob 형식 으로 간단하게 테스트 합 니 다.tinyblob 의 크기 는 255 바이트 이 고 blob 형식의 크기 는 65k 이 며 mediumblob 는 16M 이 며 longblob 는 4G 입 니 다.
빅 데이터 대상 을 직접 조작 하면 어떻게 됩 니까?
먼저 빅 데이터 대상 을 간단하게 직접 조작 해 어떤 결과 인지 살 펴 보 자.

$stmt = $pdo->prepare("insert into zy_blob (attach) values (?)");
$fp = fopen('4960364865db53dcb33bcf.rar', 'rb');
$stmt->execute([$fp]);

$stmt = $pdo->query("select attach from zy_blob where id=1");
$file = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($file); 
// Array
// (
//     [attach] => Resource id #6
// )
이 코드 에서 우 리 는 바 인 딩 필드 가 없 으 며,fopen()에서 열 린 파일 을 blob 필드 에 직접 저장 합 니 다.데이터베이스 에 blob 와 관련 된 필드 는 리 소스 id\#6 과 같은 문자열 만 저장 되 어 있 음 을 알 수 있 습 니 다.즉,어떠한 처리 도 하지 않 은 상태 에서$fp 핸들 은 문자열 형식 으로 강제 변환 되 었 고,핸들 형식 이 강 전 된 결 과 는 하나의 자원 ID 만 출력 되 었 으 며,blob 도 문자 형식의 필드 와 마찬가지 로 이 문자열 을 기록 하 였 을 뿐 입 니 다.
바른 자세
다음은 bindParam()을 통 해 데 이 터 를 삽입 하고 bindColumn()을 통 해 데 이 터 를 읽 는 정확 한 자 세 를 살 펴 보 겠 습 니 다.

$stmt = $pdo->prepare("insert into zy_blob (attach) values (?)");

$fp = fopen('4960364865db53dcb33bcf.rar', 'rb');

$stmt->bindParam(1, $fp, PDO::PARAM_LOB); //         PDO::PARAM_LOB
$stmt->execute();

$stmt = $pdo->prepare("select attach from zy_blob where id=2");
// // $file = $stmt->fetch(PDO::FETCH_ASSOC);
// // print_r($file); //   
$stmt->execute();
$stmt->bindColumn(1, $file, PDO::PARAM_LOB); //         PHP   
$stmt->fetch(PDO::FETCH_BOUND); //       ,   TRUE                PDOStatement::bindParam()   PDOStatement::bindColumn()       PHP   
print_r($file); //        
$fp = fopen('a.rar', 'wb');
fwrite($fp, $file);
총결산
빅 데이터 대상 이 조작 하 는 것 은 도대체 무엇 입 니까?사실은 우리 가 평소에 저장 해 야 할 큰 파일 이다.우 리 는 이 파일 들 을 바 이 너 리 스 트림 으로 프로그램 에 읽 은 후에 데이터베이스 필드 에 저장 합 니 다.우리 가 평소에 개발 할 때 가장 많이 사용 하 는 그림 을 생각해 서 저장 하면 이 걸 로 할 수 있다.그러나 여기 서 중점 을 둘 수 있 습 니 다.저희 가 더 추천 하 는 것 은 파일 디 렉 터 리 에 파일 을 직접 저장 하 는 것 입 니 다.데이터 베 이 스 는 경로 만 저장 하면 됩 니 다.데이터베이스 자원 은 귀중 한 것 이다.표 가 클 수록 최적화 에 불리 하고 데이터베이스 자체 에 캐 시 메커니즘 이 있어 서 이런 대형 파일 을 저장 하 는 데 자원 을 낭비 하 는 것 은 얻 는 것 보다 잃 는 것 이 많다.물론 일부 비밀 파일 이 하 드 디스크 파일 디 렉 터 리 에 직접 저장 하고 싶 지 않 거나 임시 크로스 서버 저장 방안 으로 도 사용 할 수 있 습 니 다.
현대 개발 에서 당신 의 회 사 는 클 라 우 드 저장 소(7 우,upyun,아 리 운 OSS)를 사지 않 을 정도 로 인색 하지 않 을 것 이 라 고 믿 습 니 다.그들 은 하나의 메모리,네트워크 디스크 가 될 수 있 는 것 이 아니 라 더 많은 기능 이 있다.예 를 들 어 그림 의 재단,워 터 마크,증정 하 는 CDN,대역 폭,데이터 등 이다.한 마디 로 하면 현대 의 저장 소 는 모두 가 가능 한 한 클 라 우 드 에 올 라 가 야 한다.개인 개발 이라도 많은 업 체 들 이 작은 데이터 양 을 제공 하 는 상황 에서 무료 로 사용 할 것 이다.이것 은 모두 우리 가 오 는 것 보다 훨씬 편리 하 다.
테스트 코드
참고 문서:
https://www.php.net/manual/zh/pdo.lobs.php
이상 은 phop 이 어떻게 PDO 로 빅 데이터 대상 을 조작 하 는 지 에 대한 상세 한 내용 입 니 다.phop 이 PDO 로 빅 데이터 대상 을 조작 하 는 지 에 관 한 자 료 는 저희 의 다른 관련 글 에 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기