【问题标题】:Using PHP how can I load 1000s of configuration files into a database?使用 PHP 如何将 1000 个配置文件加载到数据库中?
【发布时间】:2013-03-18 06:00:53
【问题描述】:

在一个文件夹中,我有 34,000 个配置文件。每个文件都包含一个具有唯一配置规范的对象。以下是文件内容的示例:

$obj = new obj();
$obj->name = "name":
$obj->location "nyc";
...
...
etc

每个文件的长度约为 100 到 200 行,大小约为 17k。

为了将这些输入数据库,我有以下功能:

function retrieve_files(){
    $objs = array();

    $path = 'filefolder';

    //retrieve a list of files as an array of objects
    $files = get_files('/\.inc$/', $path, 'filename', 0);

    foreach ($files as $file) {
            include_once $path.'/'.$file->filename;
            $objs[$obj->name] = $obj;
    }

    return $objs;
}

一旦对象数组被返回,它会在另一个函数中循环,序列化,然后每个都保存到数据库中。

目前,我的服务器是 Intel 双核 3.06 Ghz 处理器,具有 8 Gigs 的 RAM。我在 Ubuntu 12.04 中通过命令行运行脚本。

随着脚本的处理,CPU 达到 100% 的最大值并且内存不断攀升,直到所有 8 个演出都达到最大值。然后脚本崩溃。

我怎样才能使这个脚本或整个过程更有效率?最好我宁愿留在这个功能的范围内。我也希望一次性完成。有没有办法在创建数组和迭代循环时使用更少的资源或释放资源?

【问题讨论】:

    标签: php performance refactoring


    【解决方案1】:

    与其返回所有对象,不如说一次 100 个对象。所以像这样的

    function retrieve_files(){
        $objs = array();
    
        $path = 'filefolder';
    
        //retrieve a list of files as an array of objects
        $files = get_files('/\.inc$/', $path, 'filename', 0);
        $count = 0;
        foreach ($files as $file) {
                include_once $path.'/'.$file->filename;
                $objs[$obj->name] = $obj;
                if ( $count++%100 == 0 )
                {
                    function_to_process_obj($objs);
                    $objs = null;
                    $objs = array();
                }
        }
    }
    

    【讨论】:

      【解决方案2】:

      很明显,在第一个函数结束时,最终数组中有太多对象。

      34 000 个文件意味着您的数组 $objects 中有 34 000 个对象。

      也许您应该将对象保存在循环中。对于包含的每个文件,您将序列化对象保存在数据库中。 1 个配置文件在 DB 中有 1 行。

      【讨论】:

        猜你喜欢
        • 2014-10-07
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 2022-07-08
        • 2015-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多