>  기사  >  데이터 베이스  >  PDO가 빅데이터 객체를 작동하는 방법

PDO가 빅데이터 객체를 작동하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-06-10 17:06:072980검색

이 글에서는 PDO가 빅데이터 객체를 어떻게 운영하는지 자세히 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PDO가 빅데이터 객체를 작동하는 방법

일반적으로 데이터베이스에는 int 및 varchar 유형의 데이터만 저장합니다. 첫째, 현대 관계형 데이터베이스는 이러한 콘텐츠에 대해 많은 최적화를 수행하고 둘째, 대부분의 인덱스를 콘텐츠에 적용할 수 없습니다. 텍스트 유형 필드와 같은 필드는 인덱스 생성에 적합하지 않습니다. 따라서 데이터베이스를 사용할 때 데이터베이스에 큰 콘텐츠 필드를 저장하는 경우는 거의 없습니다. 하지만 MySQL은 실제로 이러한 유형의 스토리지를 우리를 위해 준비하지만 일반적으로 많이 사용하지는 않습니다. 오늘은 PDO를 사용해 MySQL에서 빅데이터 객체를 운용하는 방법을 배워보겠습니다.

빅 데이터 개체란 무엇입니까

"대형"은 일반적으로 "약 4kb 이상"을 의미하지만 일부 데이터베이스에서는 "대형"에 도달하기 전에 최대 32kb의 데이터를 쉽게 처리할 수 있습니다. 큰 객체는 본질적으로 텍스트이거나 바이너리일 수 있으며 PDOStatement::bindParam() 또는 PDOStatement::bindColumn() 호출에서 PDO::PARAM_LOB 유형 코드를 사용하여 PDO가 큰 데이터 유형을 사용하도록 할 수 있습니다. PDO::PARAM_LOB는 PDO에게 데이터를 스트림으로 매핑하여 PHP Streams API를 사용하여 조작할 수 있도록 지시합니다.

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;

테스트용 데이터 테이블입니다. 더 많은 정보를 저장할 수 있도록 더 큰 blob 유형인 longblob 유형으로 연결 필드를 설정했습니다. 결국 오늘날의 사진이나 파일은 몇 MB에서 수십 MB까지 쉽게 시작할 수 있으므로 간단한 테스트를 위해 가장 큰 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만 출력되고, 블롭은 캐릭터 타입만 같게 되는 것이다. 필드입니다. 이 문자열은 방금 기록되었습니다.

올바른 자세

다음으로 올바른 자세, 즉 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);

먼저, binParam()을 통해 데이터를 바인딩하고 PDO::PARAM_LOB 유형을 지정한 후 정상적으로 파일 핸들의 바이너리 내용을 데이터베이스에 삽입합니다. 다음으로, 바인딩열()을 사용하고 PDO::PARAM_LOB 유형도 지정하여 쿼리된 데이터를 가져옵니다. 조회된 필드 정보를 직접 출력해 보면 바이너리 형태의 내용임을 알 수 있습니다. 마지막으로 이 바이너리 콘텐츠를 다른 이름의 파일에 저장합니다.

위 파일의 내용을 바꾼 후 코드를 실행하여 최종 생성된 파일이 원본 파일과 동일한지 확인할 수 있습니다. 여기서 사용하고 있는 것은 압축된 패키지 파일이며, 최종 생성된 a.rar 파일은 원본 파일 및 압축 해제된 내용과 정확히 동일한 크기입니다.

요약

빅 데이터 개체는 정확히 무엇을 기반으로 작동하나요? 사실 우리가 보통 저장하는 것은 대용량 파일이다. 이러한 파일을 바이너리 스트림으로 프로그램에 읽어온 후 데이터베이스의 필드에 저장합니다. 우리가 일상적인 개발에 사용하는 대부분의 사진을 저장하는 것에 대해 생각하면 이것을 사용할 수 있습니다. 그러나 여기서 중요한 점을 도출할 수 있습니다. 파일을 파일 디렉터리에 직접 저장하고 해당 경로만 데이터베이스에 저장하는 것이 좋습니다. 데이터베이스 리소스는 소중합니다. 테이블이 클수록 최적화에 덜 도움이 됩니다. 또한 데이터베이스 자체에는 캐싱 메커니즘이 있으므로 이러한 큰 파일을 저장하기 위해 리소스를 낭비하는 것은 실제로 가치가 없습니다. 물론, 특별한 요구 사항이 있는 경우, 예를 들어 일부 개인 파일은 하드 디스크 파일 디렉터리에 직접 저장하기를 원하지 않거나 임시 서버 간 저장 솔루션으로 사용할 수 있습니다.

在现代开发中,相信你的公司也不会吝啬到不去买一个云存储(七牛、upyun、阿里云OSS)。它们不仅仅是能够做为一个存储器、网盘,而是有更多的功能,比如图片的裁剪、水印,赠送的 CDN 、带宽 、 流量之类的,总之,现代的存储大家还是尽量上云吧,即使是个人开发,也有不少厂商会提供小流量小数据量情况下的免费使用,这个都比我们自己来要方便很多。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PDO%E6%93%8D%E4%BD%9C%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1.php

相关推荐:《mysql教程

위 내용은 PDO가 빅데이터 객체를 작동하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제