Heim  >  Artikel  >  Datenbank  >  Wie PDO Big-Data-Objekte verwaltet

Wie PDO Big-Data-Objekte verwaltet

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-06-10 17:06:072980Durchsuche

Dieser Artikel gibt Ihnen eine detaillierte Einführung in die Funktionsweise von PDO mit Big-Data-Objekten. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Wie PDO Big-Data-Objekte verwaltet

Im Allgemeinen speichern wir in der Datenbank nur Daten vom Typ int und varchar. Erstens, weil moderne relationale Datenbanken viele Optimierungen für diese Inhalte haben und zweitens die meisten Indizes nicht auf den Inhalt angewendet werden können. B. Felder vom Typ Text, sind für die Erstellung von Indizes nicht geeignet. Wenn wir eine Datenbank verwenden, speichern wir daher selten große Inhaltsfelder in der Datenbank. Allerdings stellt MySQL diese Art von Speicher tatsächlich für uns bereit, aber wir nutzen ihn normalerweise nicht oft. Heute lernen wir, wie man PDO zum Betrieb von Big-Data-Objekten in MySQL verwendet.

Was sind Big-Data-Objekte?

„Groß“ bedeutet normalerweise „ungefähr 4 KB oder mehr“, obwohl einige Datenbanken problemlos bis zu 32 KB Daten verarbeiten können, bevor die Daten „groß“ werden. Große Objekte können Text- oder Binärobjekte sein, und wir können PDO dazu bringen, große Datentypen zu verwenden, indem wir den PDO::PARAM_LOB-Typcode im PDOStatement::bindParam()- oder PDOStatement::bindColumn()-Aufruf verwenden. PDO::PARAM_LOB weist PDO an, die Daten als Stream abzubilden, damit sie mithilfe der PHP-Streams-API manipuliert werden können.

Bei MySQL handelt es sich bei der Einstellung des Feldtyps auf Blob um ein Feld im großen Objektformat. Wenn bei Verwendung von bindParam () oder bindColumn () der Parameter des angegebenen Felds vom Typ PDO::PARAM_LOB ist, können Sie den Inhalt dieses Objekts direkt in Form eines Handles abrufen und ihn wie fopen( weiter bearbeiten) ).

CREATE TABLE `zy_blob` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `attach` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

Dies ist eine Datentabelle für unsere Tests. Das Attach-Feld ist auf den Longblob-Typ eingestellt, einen größeren Blob-Typ, damit wir mehr Informationen speichern können. Schließlich können heutige Bilder oder Dateien problemlos einige MB oder Dutzende MB groß sein. Für einen einfachen Test verwenden wir direkt den größten Blob-Typ. Die Größe von Tinyblob beträgt 255 Byte, die Größe des Blob-Typs beträgt 65 KB, der Mediumblob beträgt 16 MB und der Longblob beträgt 4 GB.

Was passiert, wenn wir Big-Data-Objekte direkt betreiben?

Lassen Sie uns einfach das Big-Data-Objekt direkt bedienen, um zu sehen, was das Ergebnis ist.

$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
// )

In diesem Code binden wir das Feld nicht und speichern die von fopen() geöffnete Datei direkt im Blob-Feld. Es ist ersichtlich, dass in der Datenbank in den Blob-bezogenen Feldern nur Zeichenfolgen wie die Ressourcen-ID Nr. 6 gespeichert sind. Mit anderen Worten, ohne jegliche Verarbeitung wird das $fp-Handle zu einem String-Typ gezwungen, und das Ergebnis des erzwungenen Handle-Typs ist, dass nur eine Ressourcen-ID ausgegeben wird und der Blob nur mit dem Zeichentyp übereinstimmt Feld. Diese Zeichenfolge wird gerade aufgezeichnet.

Richtige Haltung

Als nächstes werfen wir einen Blick auf die richtige Haltung, nämlich das Einfügen von Daten über bindParam() und das Lesen von Daten über 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);

Nachdem wir die Daten über bindParam() gebunden und den Typ PDO::PARAM_LOB angegeben haben, fügen wir zunächst den binären Inhalt des Dateihandles normal in die Datenbank ein. Als nächstes verwenden wir bindColumn() und geben außerdem den Typ PDO::PARAM_LOB an, um die abgefragten Daten abzurufen. Drucken Sie die abgefragten Feldinformationen direkt aus, und Sie können sehen, dass es sich um binäre Inhalte handelt. Abschließend speichern wir diesen Binärinhalt in einer Datei mit einem anderen Namen.

Sie können den Inhalt der obigen Datei ersetzen und dann den Code ausführen, um zu sehen, ob die endgültig generierte Datei mit der Originaldatei übereinstimmt. Was ich hier verwende, ist eine komprimierte Paketdatei, und die schließlich generierte a.rar-Datei hat genau die gleiche Größe wie die Originaldatei und der dekomprimierte Inhalt.

Zusammenfassung

Womit genau arbeiten Big-Data-Objekte? Tatsächlich handelt es sich um eine große Datei, die wir normalerweise speichern. Nachdem wir diese Dateien als Binärstreams in das Programm eingelesen haben, speichern wir sie in Feldern in der Datenbank. Wenn wir darüber nachdenken, die meisten Bilder zu speichern, die wir in der täglichen Entwicklung verwenden, können wir dies dafür nutzen. Hier kann jedoch der wichtige Punkt hervorgehoben werden. Es wird empfohlen, die Dateien direkt im Dateiverzeichnis zu speichern und nur deren Pfade in der Datenbank zu speichern. Datenbankressourcen sind kostbar. Je größer die Tabelle ist, desto weniger förderlich ist sie für die Optimierung. Darüber hinaus ist die Datenbank selbst über einen Caching-Mechanismus verfügt. Es lohnt sich nicht, ihre Ressourcen zu verschwenden, um so große Dateien zu speichern. Wenn beispielsweise besondere Anforderungen bestehen, möchten einige private Dateien nicht direkt im Dateiverzeichnis der Festplatte gespeichert werden, oder sie können als temporäre serverübergreifende Speicherlösung verwendet werden.

在现代开发中,相信你的公司也不会吝啬到不去买一个云存储(七牛、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教程

Das obige ist der detaillierte Inhalt vonWie PDO Big-Data-Objekte verwaltet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen