Как оптимизировать все картинки на сайте разом?

У меня есть плагин который с помощью phpthumb оптимизирует при загрузке, его ведь можно превратить чтобы он оптимизировал все картинки по запуску, как получить список все картинок что используются на сайте?
<?php
$fullPath = $source->getBases() ['pathAbsolute'] . $directory;
foreach ($files as $file)
{

    if (strripos($file['type'], 'image') === false || $file['type'] == 'image/svg+xml')
    {
        return;
    }

    $name = $file['name'];
    $pathToImage = $fullPath . $name;

    if (exif_imagetype($pathToImage) == IMAGETYPE_JPEG)
    {

        $params = array(
            'w' => 1920,
            'f' => 'jpeg',
            'q' => 80,
        );

    }
    elseif (exif_imagetype($pathToImage) == IMAGETYPE_PNG)
    {

        $params = array(
            'w' => 1920,
            'f' => 'png',
            'q' => 80,
        );

    }
    elseif (exif_imagetype($pathToImage) == IMAGETYPE_GIF)
    {
        return;
    }

    $phpThumb = $modx->getService('modphpthumb', 'modPhpThumb', MODX_CORE_PATH . 'model/phpthumb/', array());
    $phpThumb->setSourceFilename($pathToImage);

    foreach ($params as $k => $v)
    {
        $phpThumb->setParameter($k, $v);
    }

    if ($phpThumb->GenerateThumbnail())
    {
        if (!$phpThumb->renderToFile($pathToImage))
        {
            $modx->log(1, 'Ошибка сохранения изображения в [' . $pathToImage . ']');
        }
    }
    else
    {
        $modx->log(1, print_r($phpThumb->debugmessages, 1));
    }

}
Vladimir
02 мая 2022, 09:28
modx.pro
1 205
0

Комментарии: 6

Vladimir
02 мая 2022, 11:31
0
Сделал так, но вылезают такие ошибки, хотя при загрузке как через плагин всё работает
imagesx(): supplied resource is not a valid Image resource
[2022-05-02 13:55:35] (ERROR @ core/model/phpthumb/phpthumb.class.php : 4045) PHP warning: imagesy(): supplied resource is not a valid Image resource
[2022-05-02 13:55:35] (ERROR @ core/model/phpthumb/phpthumb.class.php : 3370) PHP warning: imagecolortransparent(): supplied resource is not a valid Image resource
[2022-05-02 13:55:35] (ERROR @ core/model/phpthumb/phpthumb.class.php : 4475) PHP warning: imagecopy(): supplied resource is
. Путь выдаёт правильный прям от корня хоста до картинки
<?php

$dir_name = MODX_BASE_PATH."media";


function optimezieImg($pathToImage){
    global $modx;
    $params = array();
    if (exif_imagetype($pathToImage) == IMAGETYPE_JPEG)
    {

        $params = array(
            'w' => 1920,
            'f' => 'jpeg',
            'q' => 80,
        );

    }
    elseif (exif_imagetype($pathToImage) == IMAGETYPE_PNG)
    {

        $params = array(
            'w' => 1920,
            'f' => 'png',
            'q' => 80,
        );

    }
    elseif (exif_imagetype($pathToImage) == IMAGETYPE_GIF)
    {
        return;
    }

    $phpThumb = $modx->getService('modphpthumb', 'modPhpThumb', MODX_CORE_PATH . 'model/phpthumb/', array());
    $phpThumb->setSourceFilename($pathToImage);

    foreach ($params as $k => $v)
    {
        $phpThumb->setParameter($k, $v);
    }

    if ($phpThumb->GenerateThumbnail())
    {
        if (!$phpThumb->renderToFile($pathToImage))
        {
            $modx->log(1, 'Ошибка сохранения изображения в [' . $pathToImage . ']');
        }
    }
    else
    {
        $modx->log(1, print_r($phpThumb->debugmessages, 1));
    }    
}


function get_all_directory_and_files($dir){
 
     $dh = new DirectoryIterator($dir);   
     // Dirctary object 
     foreach ($dh as $item) {
         if (!$item->isDot()) {
            if ($item->isDir()) {
                get_all_directory_and_files("$dir/$item");
            } else {
                $currentFileExt = pathinfo($dir . "/" . $item->getFilename(), PATHINFO_EXTENSION);
                if($currentFileExt == 'jpg' || $currentFileExt == 'png' || $currentFileExt == 'jpeg'){
                    optimezieImg($dir . "/" . $item->getFilename());
                }
            }
         }
      }
   }
 
  # Call function 
  
get_all_directory_and_files($dir_name);
    Vladimir
    03 мая 2022, 11:02
    0
    Есть у кого-нибудь идеи?
      Николай Савин
      03 мая 2022, 11:57
      0
      Ну для начала идея — не использовать для таких задач плагин.
      Это некорректно с точки зрения архитектуры (плагин по своей сути это функция). А также плагин ограничен максимальным временем выполнения PHP скрипта.

      Такие задачи выполняются в CLI режиме. То есть создайте отдельный php файл, подключите туда MODX, перенесите ваш код. Желательно переделать в класс и использовать ООП. И выполняйте код в консольном режиме.
        Vladimir
        03 мая 2022, 12:18
        0
        Кстати да заработало, можно кратко почему оно не работало из консоли? типо из-за прав? но ведь оно работало как плагин. Конечно сделал не так всё как вы сказали, но для компании для которой нужно всё быстро и чтоб работало сойдёт, да и пока нет знаний чтобы сделать как вы сказали

        <?php
        
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
        error_reporting(E_ALL);
        
        define('MODX_API_MODE', true);
        require dirname(dirname((__FILE__))) . '/index.php';
        
        
        
        $BASE_PATH = dirname(dirname((__FILE__)));
        $CORE_PATH = "{$BASE_PATH}/core/";
        
        
        $dir_name = "{$BASE_PATH}/media";
        
        $phpThumb = $modx->getService('modphpthumb', 'modPhpThumb', "{CORE_PATH}model/phpthumb/", array());
        
        function optimezieImg($pathToImage, $phpThumb){
            global $modx;
            $params = array();
            if (exif_imagetype($pathToImage) == IMAGETYPE_JPEG)
            {
        
                $params = array(
                    'w' => 1920,
                    'f' => 'jpeg',
                    'q' => 80,
                );
        
            }
            elseif (exif_imagetype($pathToImage) == IMAGETYPE_PNG)
            {
        
                $params = array(
                    'w' => 1920,
                    'f' => 'png',
                    'q' => 80,
                );
        
            }
            elseif (exif_imagetype($pathToImage) == IMAGETYPE_GIF)
            {
                return;
            }
            
            
            
            $phpThumb->setSourceFilename($pathToImage);
        
            foreach ($params as $k => $v)
            {
                $phpThumb->setParameter($k, $v);
            }
        
            if ($phpThumb->GenerateThumbnail())
            {
                if (!$phpThumb->renderToFile($pathToImage))
                {
                    $modx->log(1, 'Ошибка сохранения изображения в [' . $pathToImage . ']');
                }
            }
            else
            {
                $modx->log(1, print_r($phpThumb->debugmessages, 1));
            }    
        }
        
        
        
        $directoryIterator = new RecursiveDirectoryIterator($dir_name);
        $iteratorOverIterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::CHILD_FIRST);
        
        $allowedExts = array('jpg','png','jpeg');
        
        $files = array();
        
        foreach ($iteratorOverIterator as $file) {
            
            if ($file->isFile()) {
                $currentFileExt = pathinfo($file->getFilename(), PATHINFO_EXTENSION);
                if(in_array($currentFileExt, $allowedExts)){
                    array_push($files, $file->getPathname());
                }
            } 
        }
        
        foreach ($files as $file) {
            
            optimezieImg($file, $phpThumb);
            
        }
        
        
        echo 'Done';
          Николай Савин
          03 мая 2022, 16:52
          0
          Вряд ли из-за прав. Скорее просто плагин не успевал выполнить задачу за доступное время. А в консольном режиме ограничения времени на выполнение PHP скрипта нет. Он может и неделю выполняться.
      Vladimir
      03 мая 2022, 11:25
      0
      Можно как их оптимизировать разом? вверху полу рабочий скрипт, собирает все картинки но выдаёт ошибку, мол плохие картинки. Использовать phpthumbof и так далее через тэги, нет не выход, с ними постоянно проблемы с кэшем, что делает только хуже, по этому нужно сделать чтобы все существующие картинки прогнал через сам себя встроенный phpthumb, великолепно справляется со своей работой, в качестве плагина на загрузку файлов
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6