使用PHP如何将1000个配置文件加载到数据库中


Using PHP how can I load 1000s of configuration files into a database?

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

$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。我在Ubuntu 12.04中通过命令行运行该脚本。

当脚本处理时,CPU达到100%的最大值,内存攀升,直到所有8个Gig都达到最大值。然后脚本崩溃。

如何使这个脚本或整个过程更高效?我更愿意呆在这个职能的范围内。我也更喜欢一次性完成。有没有一种方法可以重构它,在创建数组和迭代循环时使用更少的资源或释放资源?

与其返回所有对象,不如说一次返回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();
            }
    }
}

很明显,在第一个函数末尾的最终数组中有太多对象。

34000个文件意味着数组$objects中有34000个对象。

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