이 글에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!