PHP:扫描目录,压缩和覆盖图像 - 生产脚本失败,只在本地产生警告

PHP: scan directory, compress & overwrite images - script fails on production, produces just warnings on local

我有这个代码 运行 作为 cron 任务。基本上它所做的(应该)是通过一个文件夹,找到大于指定大小的图像,重新调整它们并覆盖它们。

在本地测试时(使用相同的 1300 多张图片)它可以工作。如果我在 @ 上删除 imagecreatefromjpegimagecreatefrom_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);

错误是内存不足。