PHP:扫描目录,压缩和覆盖图像 - 生产脚本失败,只在本地产生警告
PHP: scan directory, compress & overwrite images - script fails on production, produces just warnings on local
我有这个代码 运行 作为 cron 任务。基本上它所做的(应该)是通过一个文件夹,找到大于指定大小的图像,重新调整它们并覆盖它们。
在本地测试时(使用相同的 1300 多张图片)它可以工作。如果我在 @ 上删除 imagecreatefromjpeg 和 imagecreatefrom_png 错误抑制剂,我会收到以下警告:
Warning: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error:
Invalid SOS parameters for sequential JPEG in
C:\xampp56\htdocs\svamz\static\uploaded\image_compress.php on line 70
Warning: imagecreatefromjpeg(): './certificate/POCAJT4.jpg' is not a
valid JPEG file in
C:\xampp56\htdocs\svamz\static\uploaded\image_compress.php on line 70
POCAJT4.jpg resize Failed!
此警告是针对某些图像输出的,但大多数图像都经过压缩,因此会跳过这些带有警告的图像。
问题是在服务器(Apache2,PHP 5.6.40)上执行相同的代码只会产生 500 HTTP 错误。没有错误,没有警告(这让调试变得很痛苦)
Source/Target 目录可写。我还通过使用 filesize($imagePath) > 8000000 && filesize($imagePath) < 9000000 更改 if 语句以仅包含一部分图像来测试代码,并且在服务器。但是,一旦我尝试了一系列包含这些有问题的图像的文件大小,它就会回到 500。
我试图通过 try catch 来解决问题,我还使用了 set_error_handler( ) 尝试捕获服务器上的 E_WARNING 消息,但没有结果。
gd_info() 在本地和服务器上是一样的。
我认为它是不相关的,但是 php -v(也 error.log)连同它的正常输出给出了这个:
加载失败/usr/local/lib/ZendGuardLoader5.6.so: /usr/local/lib/ZendGuardLoader5.6.so: 无法打开共享对象文件: 没有那个文件或目录
ini_set('error_reporting', E_ALL);
ini_set('max_execution_time', 0);
$imagesDirectory = './certificate/'; //Source directory
$destinationDirectory = './certificate/'; //Destination directory
$newImageWidth = 1600;
$newImageHeight = 1200;
$quality = 80;
// Source image directory, loop through each Image and resize it.
if($dir = opendir($imagesDirectory)){
while(($file = readdir($dir))!== false){
$imagePath = $imagesDirectory.$file;
$destPath = $destinationDirectory.$file;
$checkValidImage = @getimagesize($imagePath);
//image exists, is valid & larger than X
if(file_exists($imagePath) && $checkValidImage && filesize($imagePath) > 800000)
{
// resize
if(resizeImage($imagePath,$destPath,$newImageWidth,$newImageHeight,$quality))
{
echo $file.' resized<br>';
} else{
echo $file.' resize Failed!<br>';
}
}
}
closedir($dir);
}
}
//Function that resizes image.
function resizeImage($srcImage,$destImage, $maxWidth,$maxHeight,$quality)
{
// Get dimensions of source image.
list($origWidth, $origHeight, $type) = getimagesize($srcImage);
if ($maxWidth == 0) {
$maxWidth = $origWidth;
}
if ($maxHeight == 0) {
$maxHeight = $origHeight;
}
// Calculate ratio of desired maximum sizes and original sizes.
$widthRatio = $maxWidth / $origWidth;
$heightRatio = $maxHeight / $origHeight;
// Ratio used for calculating new image dimensions.
$ratio = min($widthRatio, $heightRatio);
// Calculate new image dimensions.
$newWidth = (int)$origWidth * $ratio;
$newHeight = (int)$origHeight * $ratio;
$newCanvas = imagecreatetruecolor($newWidth, $newHeight);
switch(strtolower(image_type_to_mime_type($type)))
{
case 'image/jpeg':
$newImage = @imagecreatefromjpeg($srcImage);
if (!$newImage) {
return false;
}
// copy file
if(imagejpeg($newCanvas,$destImage,$quality)) {
imagedestroy($newCanvas);
return true;
}
break;
case 'image/png':
$newImage = @imagecreatefrompng($srcImage);
if (!$newImage) {
return false;
}
// copy file
if(imagepng($newCanvas,$destImage, floor($quality / 10))) {
imagedestroy($newCanvas);
return true;
}
break;
default:
return false;
}
try
{
// Resize Image
imagecopyresampled($newCanvas, $newImage,0, 0, 0, 0, $newWidth, $newHeight, $origWidth, $origHeight);
}
catch (Exception $e)
{
print $e->getMessage();
return false;
}
}
目标是在可能的情况下压缩和覆盖,如果不可能则跳过。我无法控制最终用户上传的图像。
任何形式的帮助将不胜感激。
@misorude 目前无法执行此操作,因为此时具有写入权限的人不在。
原来设置 ini_set('error_reporting', E_ALL); 是不够的。
这对我有用:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
错误是内存不足。
我有这个代码 运行 作为 cron 任务。基本上它所做的(应该)是通过一个文件夹,找到大于指定大小的图像,重新调整它们并覆盖它们。
在本地测试时(使用相同的 1300 多张图片)它可以工作。如果我在 @ 上删除 imagecreatefromjpeg 和 imagecreatefrom_png 错误抑制剂,我会收到以下警告:
Warning: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error:
Invalid SOS parameters for sequential JPEG in
C:\xampp56\htdocs\svamz\static\uploaded\image_compress.php on line 70
Warning: imagecreatefromjpeg(): './certificate/POCAJT4.jpg' is not a
valid JPEG file in
C:\xampp56\htdocs\svamz\static\uploaded\image_compress.php on line 70
POCAJT4.jpg resize Failed!
此警告是针对某些图像输出的,但大多数图像都经过压缩,因此会跳过这些带有警告的图像。
问题是在服务器(Apache2,PHP 5.6.40)上执行相同的代码只会产生 500 HTTP 错误。没有错误,没有警告(这让调试变得很痛苦)
Source/Target 目录可写。我还通过使用 filesize($imagePath) > 8000000 && filesize($imagePath) < 9000000 更改 if 语句以仅包含一部分图像来测试代码,并且在服务器。但是,一旦我尝试了一系列包含这些有问题的图像的文件大小,它就会回到 500。
我试图通过 try catch 来解决问题,我还使用了 set_error_handler( ) 尝试捕获服务器上的 E_WARNING 消息,但没有结果。
gd_info() 在本地和服务器上是一样的。
我认为它是不相关的,但是 php -v(也 error.log)连同它的正常输出给出了这个: 加载失败/usr/local/lib/ZendGuardLoader5.6.so: /usr/local/lib/ZendGuardLoader5.6.so: 无法打开共享对象文件: 没有那个文件或目录
ini_set('error_reporting', E_ALL);
ini_set('max_execution_time', 0);
$imagesDirectory = './certificate/'; //Source directory
$destinationDirectory = './certificate/'; //Destination directory
$newImageWidth = 1600;
$newImageHeight = 1200;
$quality = 80;
// Source image directory, loop through each Image and resize it.
if($dir = opendir($imagesDirectory)){
while(($file = readdir($dir))!== false){
$imagePath = $imagesDirectory.$file;
$destPath = $destinationDirectory.$file;
$checkValidImage = @getimagesize($imagePath);
//image exists, is valid & larger than X
if(file_exists($imagePath) && $checkValidImage && filesize($imagePath) > 800000)
{
// resize
if(resizeImage($imagePath,$destPath,$newImageWidth,$newImageHeight,$quality))
{
echo $file.' resized<br>';
} else{
echo $file.' resize Failed!<br>';
}
}
}
closedir($dir);
}
}
//Function that resizes image.
function resizeImage($srcImage,$destImage, $maxWidth,$maxHeight,$quality)
{
// Get dimensions of source image.
list($origWidth, $origHeight, $type) = getimagesize($srcImage);
if ($maxWidth == 0) {
$maxWidth = $origWidth;
}
if ($maxHeight == 0) {
$maxHeight = $origHeight;
}
// Calculate ratio of desired maximum sizes and original sizes.
$widthRatio = $maxWidth / $origWidth;
$heightRatio = $maxHeight / $origHeight;
// Ratio used for calculating new image dimensions.
$ratio = min($widthRatio, $heightRatio);
// Calculate new image dimensions.
$newWidth = (int)$origWidth * $ratio;
$newHeight = (int)$origHeight * $ratio;
$newCanvas = imagecreatetruecolor($newWidth, $newHeight);
switch(strtolower(image_type_to_mime_type($type)))
{
case 'image/jpeg':
$newImage = @imagecreatefromjpeg($srcImage);
if (!$newImage) {
return false;
}
// copy file
if(imagejpeg($newCanvas,$destImage,$quality)) {
imagedestroy($newCanvas);
return true;
}
break;
case 'image/png':
$newImage = @imagecreatefrompng($srcImage);
if (!$newImage) {
return false;
}
// copy file
if(imagepng($newCanvas,$destImage, floor($quality / 10))) {
imagedestroy($newCanvas);
return true;
}
break;
default:
return false;
}
try
{
// Resize Image
imagecopyresampled($newCanvas, $newImage,0, 0, 0, 0, $newWidth, $newHeight, $origWidth, $origHeight);
}
catch (Exception $e)
{
print $e->getMessage();
return false;
}
}
目标是在可能的情况下压缩和覆盖,如果不可能则跳过。我无法控制最终用户上传的图像。 任何形式的帮助将不胜感激。
@misorude 目前无法执行此操作,因为此时具有写入权限的人不在。
原来设置 ini_set('error_reporting', E_ALL); 是不够的。
这对我有用:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
错误是内存不足。