SQL 通过 Medoo 查询完成时间太长
SQL query via Medoo taking too long to finish
我的脚本允许您上传一个 zip 文件,然后在解压缩后使用 Medoo 将单个文件信息插入到数据库中。我的脚本完成时间太长,即使我将最长执行时间设置为 5 分钟后,我仍收到通知,指出已超过最长执行时间。
zip 中只有大约 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;
}
?>
我明白了。我意识到 $zip->extractTo($zipFile->get("uploadedFilePath"))
试图为循环的每次迭代提取 650 个文件,即 650 次。
我只是将提取代码移到了循环之外,脚本执行得很快。
我的脚本允许您上传一个 zip 文件,然后在解压缩后使用 Medoo 将单个文件信息插入到数据库中。我的脚本完成时间太长,即使我将最长执行时间设置为 5 分钟后,我仍收到通知,指出已超过最长执行时间。
zip 中只有大约 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;
}
?>
我明白了。我意识到 $zip->extractTo($zipFile->get("uploadedFilePath"))
试图为循环的每次迭代提取 650 个文件,即 650 次。
我只是将提取代码移到了循环之外,脚本执行得很快。