猿问

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

我有这个作为 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 错误。没有错误,没有警告(这使得调试很麻烦)


源/目标目录是可写的。我还通过使用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)){        


目标是在可能的情况下进行压缩和覆盖,如果没有则跳过。我无法控制最终用户上传的图像。任何形式的帮助将不胜感激。


jeck猫
浏览 128回答 1
1回答

白衣染霜花

@misorude 此时无法执行此操作,因为此时具有写入权限的人不在。原来设置只是ini_set('error_reporting', E_ALL); 是不足够的。这对我有用:ini_set('display_errors', 1);ini_set('display_startup_errors', 1);error_reporting(E_ALL);错误是内存不足。
随时随地看视频慕课网APP
我要回答