Maison  >  Article  >  base de données  >  Comment PDO exploite les objets Big Data

Comment PDO exploite les objets Big Data

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-06-10 17:06:072994parcourir

Cet article vous donnera une introduction détaillée à la façon dont PDO exploite les objets Big Data. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment PDO exploite les objets Big Data

Généralement dans la base de données, nous enregistrons uniquement les données de type int et varchar. Premièrement, parce que les bases de données relationnelles modernes ont beaucoup d'optimisations pour ces contenus, et deuxièmement, la plupart des index ne peuvent pas l'être. appliqué aux champs avec trop de contenu. Par exemple, les champs de type texte ne conviennent pas à la création d'index. Par conséquent, lorsque nous utilisons une base de données, nous stockons rarement des champs de contenu volumineux dans la base de données. Cependant, MySQL prépare effectivement ce type de stockage pour nous, mais nous ne l’utilisons généralement pas beaucoup. Aujourd'hui, nous allons apprendre à utiliser PDO pour exploiter des objets Big Data dans MySQL.

Que sont les objets Big Data ?

« Grand » signifie généralement « environ 4 Ko ou plus », bien que certaines bases de données puissent facilement gérer des données jusqu'à 32 Ko. Les objets volumineux peuvent être de nature texte ou binaire, et nous pouvons faire en sorte que PDO utilise des types de données volumineux en utilisant le code de type PDO::PARAM_LOB dans l'appel PDOStatement::bindParam() ou PDOStatement::bindColumn(). PDO::PARAM_LOB indique à PDO de mapper les données sous forme de flux afin qu'elles puissent être manipulées à l'aide de l'API PHP Streams.

Pour MySQL, définir le type de champ sur blob est un champ au format grand objet. Lors de l'utilisation de bindParam() ou bindColumn(), si le paramètre du champ spécifié est de type PDO::PARAM_LOB, vous pouvez directement obtenir le contenu de cet objet sous la forme d'un handle et continuer à opérer dessus comme 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;

Il s'agit d'une table de données pour nos tests. Le champ de pièce jointe est défini sur le type longblob, qui est un type blob relativement volumineux, afin que nous puissions stocker plus d'informations. Après tout, les images ou fichiers d'aujourd'hui peuvent facilement commencer à partir de quelques Mo ou des dizaines de Mo. Nous utilisons directement le plus grand type de blob pour un test simple. La taille du tinyblob est de 255 octets, la taille du type blob est de 65 Ko, celle du mediumblob est de 16 Mo et celle du longblob est de 4G.

Que se passe-t-il si vous manipulez directement des objets Big Data ?

Exploitons simplement directement l'objet Big Data pour voir quel est le résultat.

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

Dans ce code, nous ne lions pas le champ et stockons directement le fichier ouvert par fopen() dans le champ blob. On peut voir que dans la base de données, les champs liés au blob stockent uniquement des chaînes telles que l'ID de ressource n°6. En d'autres termes, sans aucun traitement, le handle $fp est forcé à un type de chaîne, et le résultat du type de handle forcé est que seul un ID de ressource sera généré, et le blob ne sera que le même que le type de caractère. champ. Cette chaîne vient d'être enregistrée.

Posture correcte

Jetons ensuite un coup d'œil à la posture correcte, qui consiste à insérer des données via bindParam() et à lire les données via 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);

Tout d'abord, après avoir lié les données via bindParam() et spécifié le type PDO::PARAM_LOB, nous insérons normalement le contenu binaire du descripteur de fichier dans la base de données. Ensuite, nous utilisons bindColumn() et spécifions également le type PDO::PARAM_LOB pour obtenir les données interrogées. Imprimez directement les informations du champ interrogé et vous pouvez voir qu'il s'agit d'un contenu de type binaire. Enfin, nous sauvegardons ce contenu binaire dans un fichier sous un autre nom.

Vous pouvez remplacer le contenu du fichier ci-dessus, puis exécuter le code pour voir si le fichier final généré est le même que le fichier d'origine. Ce que j'utilise ici est un fichier de package compressé, et le fichier a.rar finalement généré a exactement la même taille que le fichier d'origine et le contenu décompressé.

Résumé

Sur quoi fonctionnent exactement les objets Big Data ? En fait, il s’agit d’un fichier volumineux que nous sauvegardons habituellement. Après avoir lu ces fichiers dans le programme sous forme de flux binaires, nous les enregistrons dans des champs de la base de données. En pensant à sauvegarder le plus grand nombre d’images que nous utilisons dans le développement quotidien, nous pouvons l’utiliser pour le faire. Cependant, le point important peut être souligné ici. Il est plus recommandé que les fichiers soient enregistrés directement dans le répertoire de fichiers et que seuls leurs chemins soient enregistrés dans la base de données. Les ressources de la base de données sont précieuses : plus la table est grande, moins elle est propice à l'optimisation. De plus, la base de données elle-même dispose d'un mécanisme de mise en cache. Cela ne vaut pas la peine de gaspiller ses ressources pour sauvegarder des fichiers aussi volumineux. Bien sûr, s'il existe des besoins particuliers, par exemple, certains fichiers privés ne souhaitent pas être enregistrés directement dans le répertoire de fichiers du disque dur, ou ils peuvent être utilisés comme solution de stockage temporaire entre serveurs.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer