php查询mysql大量数据造成内存不足的解决方法_php技巧
本文实例分析了php查询mysql大量数据造成内存不足的解决方法。分享给大家供大家参考。具体分析如下:
一、问题
使用php查询mysql大数据量的时候,程序尚未执行完毕,跳出警告:
Fatal error: Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes)
错误提示:php所分配到的100M内存被占用完毕。
二、解决方法:
最简单的解决办法是:在执行文件的头部增加:
ini_set('memory_limit','256M');
把内存增加到256M或者更多,可以增大php所使用的内存空间
但是下次若要读取更多的数据该怎么办呢,总不能一次次的增加,导致服务器的内存都被php吃光。
这里介绍一个函数:
使用memory_get_usage()方法获得php使用的内存量。发现随着读取数据条数的增加,php使用的内存在一步步增加。
难道php在查询mysql时的数据是存在内存中的?搜索了一下,发现果真大概就是这个意思。
mysql的C API函数有mysql_use_result()和mysql_store_result()
mysql_store_result()会把结果集从mysqlServer读到客户端,而 mysql_use_result()只是读取了结果集的元信息
1、php的mysql_query调用的是mysql_store_result(),自动获取并缓存结果集
2、而php的另一个函数mysql_unbuffered_query()则是调用的 mysql_use_result(),一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。
所以我们在读取大量数据的时候,可以使用mysql_unbuffered_query()来替代mysql_query()。经测试,的确如此。而且相当给力,导完所有数据内存一直保持在1MB以内,没有增长过
mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query,但不像 mysql_query()那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier。
mysql_unbuffered_query()的好处是有代价的:在 mysql_unbuffered_query()返回的结果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。
所以一定要结合自己的业务需求适当的选取函数
希望本文所述对大家的php程序设计有所帮助。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

La page est vide après que PHP se connecte à MySQL, et la raison pour laquelle la fonction Die () échoue. Lorsque vous apprenez la connexion entre PHP et la base de données MySQL, vous rencontrez souvent des choses déroutantes ...

Causes et solutions pour les erreurs Lors de l'utilisation de PECL pour installer des extensions dans un environnement Docker Lorsque nous utilisons un environnement Docker, nous rencontrons souvent des maux de tête ...

De nombreux développeurs de sites Web sont confrontés au problème de l'intégration de Node.js ou des services Python sous l'architecture de lampe: la lampe existante (Linux Apache MySQL PHP) a besoin d'un site Web ...

Les paramètres de routage ThinkPhp6 sont traités en chinois et acquisition complète. Dans le cadre ThinkPHP6, les paramètres d'URL contenant des caractères spéciaux (tels que les marques chinoises et ponctuation) sont souvent traités ...

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Lorsque vous utilisez Scapy Crawler, la raison pour laquelle les fichiers de stockage persistants ne peuvent pas être écrits? Discussion Lorsque vous apprenez à utiliser Scapy Crawler pour les robots de données, vous rencontrez souvent un ...

Comment éviter d'être détecté lors de l'utilisation de FiddlereVerywhere pour les lectures d'homme dans le milieu lorsque vous utilisez FiddlereVerywhere ...

Utilisez le module de sous-processus de Python pour exécuter WMIC ...
