通过Medoo进行SQL查询需要很长时间才能完成

时间:2015-08-06 13:06:55

标签: php sql medoo

我的脚本允许您上传zip文件,然后在提取后使用Medoo将单个文件信息插入到数据库中。即使在我将最大执行时间设置为5分钟后,我的脚本也需要很长时间才能完成,我会收到通知,说明已超出最大执行时间。

拉链中只有大约650个文件可以上传,并且脚本只能在超时前提取并插入大约一半的数据库。这个查询比我意识到的内存更密集吗?

编辑:我应该提一下,它只挂着带有大量文件的zip文件,比如上面提到的650图,程序似乎可以用少量文件执行。

代码(脚本底部附近的违规查询):

<?php

    ini_set('max_execution_time', 300);
    require_once 'vendor/medoo.min.php';
    require_once 'scripts/class.file.php';

    $database = new medoo([
        'database_type' => 'mysql',
        'database_name' => 'invoice_files',
        'server' => 'localhost',
        'username' => 'root',
        'password' => 'pass',
        'charset' => 'utf8'
    ]);

    $file = new File();
    $file->set("filename", $_FILES['uploaded-file']['name']);
    $file->set("category", "Invoice Statement");
    $file->set("file_temp_path", $_FILES["uploaded-file"]["tmp_name"]);
    $file->set("uploadedFilePath", $file->path("uploads/") . basename($file->get("filename")));
    $counter = 0;

    if($file->getPathInfo()["extension"] == "zip")
    {
        $zip = new ZipArchive;
        $zipFile = $file;
        echo "Source: " . $zipFile->get("file_temp_path") . "<br>";
        if($zip->open($zipFile->get("file_temp_path")))
        {
            for($i = 0; $i < $zip->numFiles; $i++)
            {
                $zipName = $zip->getNameIndex($i);
                $zipFile->set("uploadedFilePath", $file->path("uploads/"));
                $zipFile->set("filename", $zipName);

                for($x = 0; $x < $zip->numFiles; $x++)
                {
                    $extension = $zip->getNameIndex($x);
                    $pathInfo = pathinfo($extension);
                    if($pathInfo["extension"] != "pdf" && $pathInfo["extension"] != "xls")
                    {
                        echo "Non PDF or excel sheet detected<br>";
                        return false;
                    }
                    if($pathInfo["extension"] == "xls")
                    {
                        $excelFile = $extension;
                        $excelFlag = true;
                    }
                    else
                    {
                        $excelFlag = false;
                    }
                }

                if($zip->extractTo($zipFile->get("uploadedFilePath")))
                {
                    $pathInfo = pathinfo($zipName);
                    $database->insert('files',[
                            'name' => $zipFile->get("filename"),
                            'category' => $zipFile->get("category"),
                            'date' => $zipFile->setDate(),
                            'extension' => $pathInfo["extension"],
                            'size' => filesize($zipFile->get("uploadedFilePath") . $zipFile->get("filename")) / 1000 . 'KB',
                            'path' => $zipFile->get("uploadedFilePath") . $zipFile->get("filename")
                    ]);
                }
                else
                {
                    echo "Failure to extract<br>";
                }
            }
        }
        if($excelFlag)
        {
            $url = "insert-new-clients.php?excelfile=" . urlencode($excelFile);
            //header("location:$url");
        }
    }
    else
    {
        echo "File not in zip format";
        return false;
    }

?>

1 个答案:

答案 0 :(得分:2)

我明白了。我意识到$zip->extractTo($zipFile->get("uploadedFilePath"))试图为循环的每次迭代提取650个文件,这是650次。

我只是将提取代码移到循环外部并且脚本执行得很快。