Как оптимизировать все картинки на сайте разом?
У меня есть плагин который с помощью 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));
}
}
Комментарии: 6
Сделал так, но вылезают такие ошибки, хотя при загрузке как через плагин всё работает
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);
Есть у кого-нибудь идеи?
Ну для начала идея — не использовать для таких задач плагин.
Это некорректно с точки зрения архитектуры (плагин по своей сути это функция). А также плагин ограничен максимальным временем выполнения PHP скрипта.
Такие задачи выполняются в CLI режиме. То есть создайте отдельный php файл, подключите туда MODX, перенесите ваш код. Желательно переделать в класс и использовать ООП. И выполняйте код в консольном режиме.
Это некорректно с точки зрения архитектуры (плагин по своей сути это функция). А также плагин ограничен максимальным временем выполнения PHP скрипта.
Такие задачи выполняются в CLI режиме. То есть создайте отдельный php файл, подключите туда MODX, перенесите ваш код. Желательно переделать в класс и использовать ООП. И выполняйте код в консольном режиме.
Кстати да заработало, можно кратко почему оно не работало из консоли? типо из-за прав? но ведь оно работало как плагин. Конечно сделал не так всё как вы сказали, но для компании для которой нужно всё быстро и чтоб работало сойдёт, да и пока нет знаний чтобы сделать как вы сказали
<?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';
Вряд ли из-за прав. Скорее просто плагин не успевал выполнить задачу за доступное время. А в консольном режиме ограничения времени на выполнение PHP скрипта нет. Он может и неделю выполняться.
Можно как их оптимизировать разом? вверху полу рабочий скрипт, собирает все картинки но выдаёт ошибку, мол плохие картинки. Использовать phpthumbof и так далее через тэги, нет не выход, с ними постоянно проблемы с кэшем, что делает только хуже, по этому нужно сделать чтобы все существующие картинки прогнал через сам себя встроенный phpthumb, великолепно справляется со своей работой, в качестве плагина на загрузку файлов
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.