mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-07 10:41:40 +09:00
Merge #1709 썸네일 생성시 race condition 해소 by kijin
* pr/1709: Use lockfile instead of empty file Prevent race condition on thumbnail generation
This commit is contained in:
commit
b38b3ed01c
2 changed files with 47 additions and 13 deletions
|
|
@ -572,10 +572,11 @@ class commentItem extends Object
|
||||||
// Define thumbnail information
|
// Define thumbnail information
|
||||||
$thumbnail_path = sprintf('files/thumbnails/%s', getNumberingPath($this->comment_srl, 3));
|
$thumbnail_path = sprintf('files/thumbnails/%s', getNumberingPath($this->comment_srl, 3));
|
||||||
$thumbnail_file = sprintf('%s%dx%d.%s.jpg', $thumbnail_path, $width, $height, $thumbnail_type);
|
$thumbnail_file = sprintf('%s%dx%d.%s.jpg', $thumbnail_path, $width, $height, $thumbnail_type);
|
||||||
|
$thumbnail_lockfile = sprintf('%s%dx%d.%s.lock', $thumbnail_path, $width, $height, $thumbnail_type);
|
||||||
$thumbnail_url = Context::getRequestUri() . $thumbnail_file;
|
$thumbnail_url = Context::getRequestUri() . $thumbnail_file;
|
||||||
|
|
||||||
// return false if a size of existing thumbnail file is 0. otherwise return the file path
|
// return false if a size of existing thumbnail file is 0. otherwise return the file path
|
||||||
if(file_exists($thumbnail_file))
|
if(file_exists($thumbnail_file) || file_exists($thumbnail_lockfile))
|
||||||
{
|
{
|
||||||
if(filesize($thumbnail_file) < 1)
|
if(filesize($thumbnail_file) < 1)
|
||||||
{
|
{
|
||||||
|
|
@ -587,6 +588,9 @@ class commentItem extends Object
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create lockfile to prevent race condition
|
||||||
|
FileHandler::writeFile($thumbnail_lockfile, '', 'w');
|
||||||
|
|
||||||
// Target file
|
// Target file
|
||||||
$source_file = NULL;
|
$source_file = NULL;
|
||||||
$is_tmp_file = FALSE;
|
$is_tmp_file = FALSE;
|
||||||
|
|
@ -677,21 +681,24 @@ class commentItem extends Object
|
||||||
|
|
||||||
$output = FileHandler::createImageFile($source_file, $thumbnail_file, $width, $height, 'jpg', $thumbnail_type);
|
$output = FileHandler::createImageFile($source_file, $thumbnail_file, $width, $height, 'jpg', $thumbnail_type);
|
||||||
|
|
||||||
|
// Remove source file if it was temporary
|
||||||
if($is_tmp_file)
|
if($is_tmp_file)
|
||||||
{
|
{
|
||||||
FileHandler::removeFile($source_file);
|
FileHandler::removeFile($source_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the thumbnail path if successfully generated.
|
// Remove lockfile
|
||||||
|
FileHandler::removeFile($thumbnail_lockfile);
|
||||||
|
|
||||||
|
// Return the thumbnail path if it was successfully generated
|
||||||
if($output)
|
if($output)
|
||||||
{
|
{
|
||||||
return $thumbnail_url;
|
return $thumbnail_url;
|
||||||
}
|
}
|
||||||
|
// Create an empty file if thumbnail generation failed
|
||||||
// create an empty file not to attempt to generate the thumbnail afterwards
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FileHandler::writeFile($thumbnail_file, '', 'w');
|
FileHandler::writeFile($thumbnail_file, '','w');
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -828,17 +828,29 @@ class documentItem extends Object
|
||||||
}
|
}
|
||||||
$thumbnail_type = $config->thumbnail_type;
|
$thumbnail_type = $config->thumbnail_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define thumbnail information
|
// Define thumbnail information
|
||||||
$thumbnail_path = sprintf('files/thumbnails/%s',getNumberingPath($this->document_srl, 3));
|
$thumbnail_path = sprintf('files/thumbnails/%s',getNumberingPath($this->document_srl, 3));
|
||||||
$thumbnail_file = sprintf('%s%dx%d.%s.jpg', $thumbnail_path, $width, $height, $thumbnail_type);
|
$thumbnail_file = sprintf('%s%dx%d.%s.jpg', $thumbnail_path, $width, $height, $thumbnail_type);
|
||||||
|
$thumbnail_lockfile = sprintf('%s%dx%d.%s.lock', $thumbnail_path, $width, $height, $thumbnail_type);
|
||||||
$thumbnail_url = Context::getRequestUri().$thumbnail_file;
|
$thumbnail_url = Context::getRequestUri().$thumbnail_file;
|
||||||
|
|
||||||
// Return false if thumbnail file exists and its size is 0. Otherwise, return its path
|
// Return false if thumbnail file exists and its size is 0. Otherwise, return its path
|
||||||
if(file_exists($thumbnail_file))
|
if(file_exists($thumbnail_file) || file_exists($thumbnail_lockfile))
|
||||||
{
|
{
|
||||||
if(filesize($thumbnail_file)<1) return false;
|
if(filesize($thumbnail_file) < 1)
|
||||||
else return $thumbnail_url;
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return $thumbnail_url;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create lockfile to prevent race condition
|
||||||
|
FileHandler::writeFile($thumbnail_lockfile, '', 'w');
|
||||||
|
|
||||||
// Target File
|
// Target File
|
||||||
$source_file = null;
|
$source_file = null;
|
||||||
$is_tmp_file = false;
|
$is_tmp_file = false;
|
||||||
|
|
@ -913,11 +925,26 @@ class documentItem extends Object
|
||||||
{
|
{
|
||||||
$output = FileHandler::createImageFile($source_file, $thumbnail_file, $width, $height, 'jpg', $thumbnail_type);
|
$output = FileHandler::createImageFile($source_file, $thumbnail_file, $width, $height, 'jpg', $thumbnail_type);
|
||||||
}
|
}
|
||||||
if($is_tmp_file) FileHandler::removeFile($source_file);
|
|
||||||
// Return its path if a thumbnail is successfully genetated
|
// Remove source file if it was temporary
|
||||||
if($output) return $thumbnail_url;
|
if($is_tmp_file)
|
||||||
// Create an empty file not to re-generate the thumbnail
|
{
|
||||||
else FileHandler::writeFile($thumbnail_file, '','w');
|
FileHandler::removeFile($source_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove lockfile
|
||||||
|
FileHandler::removeFile($thumbnail_lockfile);
|
||||||
|
|
||||||
|
// Return the thumbnail path if it was successfully generated
|
||||||
|
if($output)
|
||||||
|
{
|
||||||
|
return $thumbnail_url;
|
||||||
|
}
|
||||||
|
// Create an empty file if thumbnail generation failed
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FileHandler::writeFile($thumbnail_file, '','w');
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue