gpt4 book ai didi

php - 将具有图像尺寸的记录更新到数据库。我想等不到10小时

转载 作者:行者123 更新时间:2023-11-29 11:49:16 30 4
gpt4 key购买 nike

我有一个大型 mysql 表,其中包含超过 1,200,000 行的原始图像(每个图像 1 行),采用 innoDB 格式,但我将处理大约 600,000 行。我想要快速做的是从数据库中检索本地镜像文件名,并确定其大小和尺寸,然后将详细信息存储回数据库中。

在没有图像计算的情况下在数据库上执行 I/O 速度很快,因为我已经优化配置了 mysql 设置。事实上,我配置的一个缓冲区比最大的mysql数据库文件大小的整个大小还要大。

目前,我计算图像尺寸和大小的代码是这样的:

$img='/path/to/current/image/to/find/dimensions/for.jpg';
$ifs=-1;
$iw=-1;
$ih=-1;
if ($ifs=@filesize($img)){
$im=NULL;
$im=@imagecreatefromjpeg($img);
if ($im){
$iw=imagesx($im);
$ih=imagesy($im);
imagedestroy($im);
}
$im=NULL;
}

有没有办法将此代码转换为执行时间大大缩短的格式?

记住。我正在处理本地镜像,上面的代码正在执行 600,000 次,因此优化在这里很重要,任何能为我节省一毫秒执行时间的代码都会受到赞赏。

所有相关图像均采用 jpeg 格式,尺寸通常在 600x400 像素到 800x533 像素之间

有什么想法吗?

最佳答案

getimagesize()的文档中有一个关于php.net的用户评论它不会读取整个 jpeg 文件来查找尺寸,因为尺寸存储在文件的 header 部分之后。该代码是 jpeg 特定的,不能用于其他文件类型。

此代码应该比您的代码更快,因为它不会读取整个文件,也不会从中创建资源。

<?php
// Retrieve JPEG width and height without downloading/reading entire image.
function getjpegsize($img_loc) {
$handle = fopen($img_loc, "rb") or die("Invalid file stream.");
$new_block = NULL;
if(!feof($handle)) {
$new_block = fread($handle, 32);
$i = 0;
if($new_block[$i]=="\xFF" && $new_block[$i+1]=="\xD8" && $new_block[$i+2]=="\xFF" && $new_block[$i+3]=="\xE0") {
$i += 4;
if($new_block[$i+2]=="\x4A" && $new_block[$i+3]=="\x46" && $new_block[$i+4]=="\x49" && $new_block[$i+5]=="\x46" && $new_block[$i+6]=="\x00") {
// Read block size and skip ahead to begin cycling through blocks in search of SOF marker
$block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
$block_size = hexdec($block_size[1]);
while(!feof($handle)) {
$i += $block_size;
$new_block .= fread($handle, $block_size);
if($new_block[$i]=="\xFF") {
// New block detected, check for SOF marker
$sof_marker = array("\xC0", "\xC1", "\xC2", "\xC3", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCD", "\xCE", "\xCF");
if(in_array($new_block[$i+1], $sof_marker)) {
// SOF marker detected. Width and height information is contained in bytes 4-7 after this byte.
$size_data = $new_block[$i+2] . $new_block[$i+3] . $new_block[$i+4] . $new_block[$i+5] . $new_block[$i+6] . $new_block[$i+7] . $new_block[$i+8];
$unpacked = unpack("H*", $size_data);
$unpacked = $unpacked[1];
$height = hexdec($unpacked[6] . $unpacked[7] . $unpacked[8] . $unpacked[9]);
$width = hexdec($unpacked[10] . $unpacked[11] . $unpacked[12] . $unpacked[13]);
return array($width, $height);
} else {
// Skip block marker and read block size
$i += 2;
$block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
$block_size = hexdec($block_size[1]);
}
} else {
return FALSE;
}
}
}
}
}
return FALSE;
}
?>

关于php - 将具有图像尺寸的记录更新到数据库。我想等不到10小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34427238/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com