Position actuelle: Accueil> Derniers articles> Dans quels scénarios d'application conviennent à l'utilisation de mysqli_stmt :: send_long_data pour transmettre de grandes données de fichiers? Analyse de cas réelle

Dans quels scénarios d'application conviennent à l'utilisation de mysqli_stmt :: send_long_data pour transmettre de grandes données de fichiers? Analyse de cas réelle

gitbox 2025-08-08

Dans le développement de PHP, lorsque nous devons faire face à des téléchargements de fichiers importants ou à des transferts de données, nous sommes généralement confrontés au problème de la façon de stocker ou de transférer efficacement des fichiers volumineux. Surtout lorsque vous utilisez des bases de données MySQL, les opérations traditionnelles d'insertion ou de mise à jour peuvent ne pas être en mesure de traiter efficacement les données de fichiers importantes. Pour relever ce défi, MySQLI_STMT :: Send_long_data fournit une solution efficace qui peut aider les développeurs à diffuser de grandes données de fichiers dans des bases de données.

1. Introduction à mysqli_stmt :: send_long_data

mysqli_stmt :: send_long_data est une méthode utilisée pour transmettre des mégadonnées dans l'extension PHP mysqli . Il permet le transfert d'un énorme flux de données (tel que le contenu de fichier) dans une base de données MySQL lorsque les instructions de prétraitement sont exécutées sans charger le fichier entier en mémoire. Cela peut éviter les goulots d'étranglement de mémoire ou les performances et est une fonction très pratique lors de la gestion des fichiers volumineux.

2. Scénarios d'application applicables pour l'utilisation de mysqli_stmt :: send_long_data

2.1 Téléchargez des fichiers volumineux dans la base de données

Dans certaines applications, telles que les systèmes de stockage de fichiers en ligne ou les systèmes de gestion de fichiers, les fichiers téléchargés par les utilisateurs peuvent être très importants. La lecture de données de fichiers directement dans la mémoire et l'enregistrement dans la base de données peut provoquer une pression de mémoire et même provoquer des scripts PHP. Dans ce cas, MySQLI_STMT :: SEND_LONG_DATA peut progressivement envoyer les données de fichier à la base de données, en évitant de charger le fichier entier en mémoire en même temps.

Exemple de scénario : une plate-forme de gestion d'images en ligne où les utilisateurs téléchargent des fichiers d'image. Pour améliorer l'efficacité du stockage, la plate-forme choisit de stocker des images dans un format binaire dans une base de données MySQL. En utilisant MySQLI_STMT :: Send_long_data , chaque image téléchargée est transférée en segments sans charger le fichier entier dans la mémoire, garantissant qu'aucun débordement de mémoire ne se produit lors du téléchargement de grandes images.

2.2 Traitement de grandes données de texte ou de journal

Certaines applications nécessitent de grandes quantités de données de journal ou de grandes données de texte dans la base de données. Par exemple, le système de gestion des journaux génère des GB de fichiers journaux qui doivent être enregistrés sur MySQL dans des segments. Dans ce cas, le fragment de fichier journal peut être téléchargé dans la base de données à l'aide de mysqli_stmt :: send_long_data sans charger le contenu entier du fichier à la fois.

Exemple de scénario : Un système d'analyse de journaux recueille et stocke divers fichiers journaux générés par le système. Le fichier journal est énorme et si le fichier entier est chargé à chaque fois, il aura un impact sérieux sur les performances du serveur. L'utilisation de mysqli_stmt :: send_long_data pour télécharger progressivement les fichiers journaux peut rendre le système plus efficace et stable.

2.3 Grand transfert de fichiers vidéo ou audio

Semblable à l'exigence de téléchargement de fichiers volumineux, les fichiers vidéo et audio sont également des types de fichiers grands courants, en particulier dans certaines plateformes multimédias. Pour le stockage de flux vidéo ou de flux audio, il est traditionnel de les stocker en streaming plutôt qu'à les charger en mémoire en même temps.

Exemple de scénario : un site Web vidéo doit stocker les fichiers vidéo téléchargés par l'utilisateur dans la base de données. Avec mysqli_stmt :: send_long_data , les fichiers vidéo peuvent être envoyés à la base de données dans des segments au lieu du chargement entier de fichier en mémoire, empêchant le serveur de mémoire insuffisante.

2.4 Transférer de gros objets à la base de données

Dans certaines applications, en plus des fichiers, une grande quantité de données binaires (telles que les images, l'audio, la vidéo, etc.) peut être tenue de transférer. Ces grands objets peuvent être téléchargés par les utilisateurs ou générés par des applications. mysqli_stmt :: send_long_data peut stocker efficacement ces grands objets dans la base de données, garantissant que le téléchargement de gros objets ne provoque pas de débordement de mémoire.

Exemple de scénario : un système de gestion électronique de bibliothèques où les utilisateurs téléchargent des versions électroniques de livres (PDF, EPUB, etc.) qui peuvent être très importantes. Grâce à mysqli_stmt :: send_long_data , le système peut télécharger les données du fichier du livre étape par étape, sans charger le fichier entier en mémoire en même temps, en assurant le processus de téléchargement lisse.

3. Comment utiliser mysqli_stmt :: send_long_data

L'utilisation de mysqli_stmt :: send_long_data nécessite une utilisation avec des instructions de prétraitement MySQL. Voici un exemple de code typique montrant comment utiliser cette fonction pour télécharger de grandes données de fichiers.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// Prêt à insérer des données SQL Déclaration</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO files (name, data) VALUES (?, ?)"</span></span><span>);

</span><span><span class="hljs-comment">// Chemin de fichier et flux de fichier ouvrir</span></span><span>
</span><span><span class="hljs-variable">$filePath</span></span><span> = </span><span><span class="hljs-string">"large_file.zip"</span></span><span>;
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>, </span><span><span class="hljs-string">"rb"</span></span><span>);

</span><span><span class="hljs-comment">// Lier les paramètres</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>);
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>);

</span><span><span class="hljs-comment">// Envoyer des données de fichiers dans des segments</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>*</span><span><span class="hljs-number">1024</span></span><span>)); </span><span><span class="hljs-comment">// Chaque fois 1MB données</span></span><span>

</span><span><span class="hljs-comment">// 执行Déclaration</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

</span><span><span class="hljs-comment">// 关闭文件和données库连接</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

Dans cet exemple, Fread est utilisé pour lire le contenu du fichier, et Send_long_data envoie les données de fichier à la base de données dans les segments. Lors de l'exécution de relevés, les données de fichiers ne sont pas chargées en mémoire à la fois, mais sont progressivement transférées à MySQL, évitant le risque de débordement de mémoire.

4. Choses à noter

  • Type de champ de base de données : assurez-vous que le type de champ dans la table de base de données est Blob ou LongBlob , qui convient au stockage des mégadonnées.

  • Limites de transfert : Bien que Send_Long_Data puisse transférer efficacement les fichiers volumineux, vous devez également faire attention aux restrictions de téléchargement dans la configuration PHP (telles que upload_max_filesize et post_max_size ). Ces configurations doivent être ajustées en fonction des besoins réels.

  • Taping des performances : Lors du traitement des fichiers très grands, vous pouvez optimiser en fonction des performances du serveur en ajustant la taille du bloc des données transférées (telles que 1 Mo ou 10 Mo par transfert).

5. Résumé

mysqli_stmt :: send_long_data est une fonction très pratique, en particulier adapté aux scénarios où de grands fichiers ou de grandes quantités de données sont nécessaires. En transférant des données de fichiers dans les segments, il peut aider les développeurs à éviter le débordement de la mémoire et les goulots d'étranglement des performances et à améliorer la stabilité et l'efficacité du système. Send_long_data peut jouer un rôle important dans le téléchargement de fichiers, le stockage de journaux ou le traitement des données multimédias. Par conséquent, lors du développement d'applications impliquant un traitement de fichiers important, l'utilisation rationnelle de cette fonction peut optimiser considérablement le processus de transmission des données.