slo_nik
@slo_nik

Отказ в доступе консольному контролеру, как решить?

Добрый день.
Необходимо по cron-у обрабатывать загруженные изображения.
Создал такой консольный контролер.
class ImagesController extends Controller
{
    public function actionResize()
    {
        Yii::setAlias('@web', dirname(__DIR__) . '/web');
        $path = Yii::getAlias('@web') . '/uploads';

        $images = $this->scanDir($path); // рекурсивный обход директорий
        try{
            foreach ($images as $image){
                $img = Image::getImagine()->open($path . '/' . $image);
                //echo $path . '/' . $image . PHP_EOL;
                if($img->getSize()->getWidth() > 1000){
                    Image::resize($path . '/' . $image, 1000, null)->save($path. '/' . $image, ['jpeg_quality' => 80]);
                    echo 'Done!' . PHP_EOL;
                }
            }
        }
        catch (Exception $exception){
            Yii::getLogger()->log($exception, Logger::LEVEL_WARNING);
            Yii::getLogger()->log($exception, Logger::LEVEL_ERROR);
            echo 'Error' . PHP_EOL;
        }
    }
}

При попытке запустить консольную команду происходит ошибка

ImagickException: unable to open image `/home/slonik/localhost/www/memory/web/uploads/country_1/region_5/city_5/JPJvU8GlmulD-KCHdlwBKSHHcVHhBWpk.jpg': Permission denied @ error/blob.c/OpenBlob/2712 in /home/slonik/localhost/www/memory/vendor/imagine/imagine/lib/Imagine/Imagick/Image.php:287

Если перенести это действие в web контроллер или изменить права на директории 0777, то всё работает отлично. Изображения обрабатываются.
Я понимаю, что проблема в правах доступа, но как решить эту проблему не могу сообразить.
Загрузил на рабочий сервер консольный контроллер - работает без ошибок. Вот только на localhost проблема.
В директории uploads несколько директорий, которые создаются при загрузке изображений. Директории создаются при помощи mkdir(), но параметр mode никак не влияет на права, изменить я их не могу. Просто не меняются, без всяких ошибок.
if(!file_exists($p)){
     mkdir($p, 0777, true);
};

Права доступа к директориям
drwxrwxrwx 1 slonik slonik  18 Сен 26 18:05 uploads
drwxr-xr-x 1 www-data www-data 16 Сен 26 18:05 country_1
drwxr-xr-x 1 www-data www-data 12 Сен 26 18:05 region_5
drwxr-xr-x 1 www-data www-data 20 Сен 26 18:05 city_5

Права к загруженным файлам
-rw-r--r-- 1 www-data www-data 845155 Сен 26 18:05 1g62QFwjgt67kwUcMEV3DcAViJHlAmUN.jpg
-rw-r--r-- 1 www-data www-data 878004 Сен 26 18:05 4HSV4UdL3gWFC5UKNmcYSgDJmYQODj6V.jpg
-rw-r--r-- 1 www-data www-data 824929 Сен 26 18:05 C9asvh5KiEvpOvbkh8SXXyVLzzCQyenr.jpg

Сравнил эти права доступа с правами на сервере - всё одинаково.
Как решить эту проблему для localhost?
  • Вопрос задан
  • 334 просмотра
Решения вопроса 1
slo_nik
@slo_nik Автор вопроса, куратор тега Yii
Вопрос решился. Подсказали как правильно сделать.
Необходим модуль apache2 mpm-itk.

Этот модуль позволяет запускать виртуальные хосты от имени пользователя. Кроме всего прочего, это позволяет не задумываться о выставлении дополнительных прав на те, или иные папки и файлы на ваших сайтах.

У меня Ubuntu 16.04., сервер apache2.
1)Проверяем, собран ли apache2 c поддержкой mpm-itk
в консоли
apachectl -t -D DUMP_MODULES
в результате ищем строку mpm_itk_module (static)
2)Если нет, то устанавливаем модуль.
sudo apt-get install libapache2-mpm-itk && sudo service apapche2 restart

3) Редактируем конфигурацию виртуального хоста, вписываем туда следующую инструкцию
<IfModule mpm_itk_module>
      AssignUserId your_user_name your_user_groupe
</IfModule>

4) Перезагружаем apache2.

Всё, можно пользоваться.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@sidni
Php Developer
Проблема думаю в том что веб приложение запускается от пользователя под которым запущен apache или php-fpm а консольное от того кто запускает крон то либо вы от себя.
И ясное дело, если эти файлы созданы из веб приложения то по умолчанию не доступны на измения другим пользователям.
из советов или сохранять изображения изначально с правами 0777 или добавить пользователя который запускает крон в группу апача например если это убунту то обычно это www-data
Как то сталкивался что команда
mkdir($p, 0777, true);
Не выставляет нужные права ниже дописывал chmod

Можно попробывать
sudo usermod -aG www-data YOU_USER
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы