`

php代码优化系列(一)--数据库读取_转转转

    博客分类:
  • php
阅读更多

php代码优化系列(一)--数据库读取

   php 编程时,特别是在处理大量的数据的时候,往往会发生内存超过系统的最大值的情况。这有很多原因,其中的一个原因就是不恰当的使用他提供的内部的函数,下面举一个例子来说明:

    任务:从数据库中读取 100 万条记录,存成 xml 格式。

    这似乎是一个很简单的问题,但是初学者往往错误的使用了 php 提供的函数,而发现程序根本无法运行,当然数据量小的时候都是不会有问题的。

   读取数据库的误区:

   如果你用某些封装的类库,可能会提供类似下面的一个函数:

 

 

function  query( $sql )
{
    
$rs   =   mysql_query ( $sql );
    
$result   =   array ();
    
if  ( is_resource ( $rs )) {
        
while  ( $line   =   mysql_fetch_assoc ( $rs )) {
            
$result []  =   $line ;
        }
    } 
else   if  ( $rs   ===   false ) {
         
return   false ;
    }
    
return   $result ;
}

    在数据量很小的时候这个函数很好用,执行一个 sql ,直接返回一个数组。但是要是数据量是一百万的话,你直接这样做的话,那么至少要消耗 200M 的内存,因为一个 100 万记录的数据,全部放在一个数组里面,至少要 200M 。那么怎么做呢,上面这个函数给了我们思路。$rs = mysql_query($sql); 这句返回的是一个资源,资源是什么,你可以不用深究,你可以认为是一个指针,指向你查询记录的一个指针。即使你有 1000 万的记录,这个资源占用的内存也是很小很小的。$line = mysql_fetch_assoc($rs)这一句就是把指针玩下移一个距离,然后读取该行的记录。这个很像是 file_get_contents 读取文件和 fopen fread 组合读取文件差别。比如你读取一个 100M 的文件,用 file_get_contents 就要占用 100M 的内存,用 fopen fread 组合,你就可以先用 fopen 获取一个函数的指针,然后用 fread 每次读取一个固定的字节。这样不会出现大量内存使用的情况,当然平时一个文件才几个 k ,那就算了,不用这样来节省内存。

有了以上的分析我们就知道这个程序该怎么样写了。

function  buildXml( $sql ,   $filepath   =   ''
{
    
$xml   =   " <?xml version=\ " 1.0 \ "  encoding=\ " iso - 8859 - 1 \ "  ?><records> " ;
    
$i   =   0 ;
    
$rs   =   mysql_query ( $sql );  // 获取数据库资源
     $fp   =   fopen ( $filepath ,   ' w+ ' );  // 获取文件资源
     while  ( $line   =   mysql_fetch_assoc ( $rs ))  // 读取一行
    {
        
$xml   .=  buildOneXmlNode( $line );
        
$i ++ ;
        
if  ( $i   >   0   &&   $i   %   1000   ==   0 ) {  // 为了避免频繁的io,提高效率,我们这里以1000条记录为限,做了一个缓存。1000条记录大概要迫8M的内存。
             fwrite ( $fp ,   $xml );
            
$xml   =   '' ;
            
$i   =   0 ;
        }
    }
    
fwrite ( $fp ,   $xml   .   " </records> " ); // 不要忘了这一行,$xml 可能还有没有保存的数据。还有标签要闭合。
     fclose ( $fp );
}

 

这样,我们就可以导出100W量级的数据了,可以尝试一下。注意这个bulidonenode()函数根据你具体的xml的格式,进行处理,这里只是说明思想。

分享到:
评论

相关推荐

    pecl-5.2.2RC2-nts-Win32.zip_PHP_SSH2.DLL pe_pecl_pecl-5.2.3_php_

    标题中的"pecl-5.2.2RC2-nts-Win32.zip_PHP_SSH2.DLL pe_pecl_pecl-5.2.3_php_" 提到了几个关键概念,首先是"PECL",它是PHP扩展社区库(PECL)的缩写,是一个用于PHP的开源扩展库,提供了一系列增强PHP功能的组件。...

    File-CSV-DataSource_5xzobh_file_

    CSV是一种常见的数据存储格式,广泛应用于数据库导出、数据分析和数据交换。在PHP中,处理CSV文件通常涉及到读取、写入和分析这些数据。 描述提到这是"一个用php脚本语言写的其它类别",这可能意味着除了基础的CSV...

    php-pecl-5.4.16-Win32-VC9-x86_igbinary

    "pecl"代表PHP Extension Community Library,它是PHP的一个扩展仓库,提供了一系列的开源扩展以增强PHP的功能。而"igbinary"是PHP中一个重要的扩展,它改变了PHP数据在内存中的序列化和反序列化方式,提高了性能。 ...

    php-excel-reader_lxfipr_php_

    标题“php-excel-reader_lxfipr_php_”暗示了一个基于PHP的库,用于读取Excel文件。在PHP中,处理Excel文件通常涉及到使用特定的库或工具,因为原生PHP并不支持直接读写Excel格式。`php-excel-reader`可能是这样的一...

    php从数据库中读取数据生成xml

    ### PHP从数据库中读取数据生成XML的知识点详解 #### 一、PHP连接MySQL数据库 在给定的脚本中,我们首先看到的是通过PHP连接MySQL数据库的操作。这部分代码使用了较旧的`mysql_`扩展,而不是推荐的`mysqli_`或`PDO...

    PHP IIS Windows 2003 配置

    - **PHP扩展列表:**根据提供的配置信息,我们可以看到一系列的扩展项,其中一些已经被启用(未注释),而另一些则处于禁用状态(注释掉)。 - 已启用的扩展: - `extension=php_mbstring.dll`:用于处理多字节...

    File-CSV-DataSource_stimyq_file_源码

    CSV文件是一种通用的数据交换格式,因为它简单且易于处理,被广泛用于数据导入导出、数据分析和数据库管理等场景。 在【压缩包子文件的文件名称列表】中,我们看到几个文本文件(如fileinfo.txt、99954839b88fb33f3...

    php 函数库(英汉对照)

    - **`mysql_create_db()`**:创建一个新的MySQL数据库。这对于初始化新的数据库实例非常有用。 - **`mysql_data_seek()`**:设置结果集的位置。这对于处理结果集中的数据非常有用。 以上介绍的函数涵盖了PHP与...

    [论坛社区]Discuz4.1.0-Dvbbs.PHP转换_discuz410-dvbbs.zip

    3. **转换工具**:"discuz410-dvbbs.zip"中可能包含了一个转换脚本或程序,该程序会读取Dvbbs的数据库,然后将数据格式化为Discuz!可以理解的形式。 4. **数据映射**:Dvbbs和Discuz!的数据结构可能会有所不同,...

    App.PublishWeb.zip_APP数据库_数据库网站_数据库网站html_静态html

    "App.PublishWeb"可能是用于这个静态化过程的一个工具或框架,它的功能可能是从App数据库中读取数据,然后生成一系列静态HTML页面。这通常涉及以下步骤: 1. 连接数据库:使用合适的数据库驱动程序,如ODBC或JDBC,...

    [博客空间]PJBLOG2 to Sablog-x 1.6 转换程序_pjblog2.zip

    另一方面,Sablog-x 1.6是一个更新且功能更加强大的博客平台,它在PJBLOG2的基础上进行了许多改进,包括更好的性能、优化的用户体验、更丰富的插件和主题支持,以及对现代Web标准的兼容。升级到Sablog-x 1.6可以帮助...

    php-excel-reader-2.21.rar_excel_excel_reader2._php excel_php ex

    在PHP开发中,有时我们需要处理Excel文件,例如读取数据、分析内容或导入数据库。"php-excel-reader-2.21.rar" 是一个压缩包,包含了一个名为 "php-excel-reader-2.21" 的项目,它是一个用于读取Excel文件的PHP库,...

    [博客空间]WordPress to Sablog-X 1.6 转换程序_wordpress.zip

    1. **转换脚本**:可能是一个PHP脚本,用于读取WordPress的数据库,然后转换成Sablog-X可以识别的格式。 2. **使用指南**:PDF或HTML文档,详细说明如何运行转换程序和在两个系统间迁移数据的步骤。 3. **数据库结构...

    PHP-CSV.rar_open_php txt

    CSV文件格式则是一种简单且通用的数据存储格式,常用于数据导入导出,因为它可以被多种程序读取,包括电子表格软件如Microsoft Excel和数据分析工具。 标题“PHP-CSV.rar_open_php txt”暗示了这个压缩包可能包含...

    mysql-to-dbf.rar_Big!_DBF_php mysql dbf

    1. **DBF 文件**:DBF 文件是 dBase 系列数据库管理系统创建的一种表格文件格式,广泛用于存储结构化数据。尽管现在已不常见,但仍有软件支持读写 DBF 文件,如 FoxPro、Visual FoxPro 或者通过开源库在 PHP 中处理...

    ecshop二次开发必备ecshop函数列表大全

    在进行ECShop二次开发时,掌握一系列核心函数是至关重要的。这些函数涵盖了时间处理、字符串操作、网络通信、文件处理、安全防护等多个方面,以下是这些函数的详细说明: 1. **lib_time.php** - `gmtime()`: 返回...

    ecshop二次开发函数

    ECShop是一款开源的电商系统,它的二次开发是针对商家或开发者根据自身需求对原系统进行功能扩展或定制的过程。在ECShop的二次开发中,掌握其内置的函数库至关重要,这些函数提供了处理时间、字符串、文件、网络通信...

    php函数大全 word版本

    PHP函数大全是一个集合了众多PHP内置函数的参考文档,涵盖了从基础到高级的各种用途的函数。这个大全由天酷女性时尚网(www.tiancool.com)整理发布,并且要求在转载时注明出处。以下是一些主要类别的PHP函数的详细...

    关于mysql sql数据库的优化

    ### MySQL 数据库优化知识点 #### 一、tmp_table_size参数的理解与优化 - **定义**:`tmp_table_size`参数用于设置MySQL在创建临时表时所使用的内存大小上限。当临时表的数据量超过该值时,系统会自动将内存中的...

    File-CSV-DataSource_v0ygou_file_

    CSV是一种常见的数据交换格式,广泛应用于数据分析、导入导出数据库等场景。 描述中的“php脚本语言实现,这是一个用php脚本语言写的其它类别”进一步确认了这个项目是使用PHP编写的,并且可能不局限于标准的PHP...

Global site tag (gtag.js) - Google Analytics