apache2, mod_php: проблема с определением mime типа(finfo_open)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
Bluetooth
Сообщения: 4395
Статус: Блюзовый
ОС: Debian Squeeze amd64

apache2, mod_php: проблема с определением mime типа(finfo_open)

Сообщение Bluetooth »

Итак, имеется хост с apache2+mod_php:

Код: Выделить всё

$ cat /etc/redhat-release
ALT Linux Sisyphus (20081222)
$ rpm -qa|grep apache
apache2-icons-2.2.21-alt1
apache2-datadirs-2.2.21-alt1
apache2-mod_rpaf-0.6-alt4
apache2-2.2.21-alt1
apache2-cgi-bin-2.2.21-alt1
apache2-common-2.2.21-alt1
apache2-html-2.2.21-alt1
apache2-mod_php5-5.3.8.20110823-alt1.M60P.1
apache2-mod_disk_cache-2.2.21-alt1
apache2-cgi-bin-printenv-2.2.21-alt1
apache2-cgi-bin-test-cgi-2.2.21-alt1
apache2-httpd-prefork-2.2.21-alt1
apache2-base-2.2.21-alt1
apache2-htcacheclean-2.2.21-alt1
$ rpm -qa|grep php
php5-exif-5.3.8.20110823-alt0.M60P.1
php5-libs-5.3.8.20110823-alt1.M60P.1
php5-curl-5.3.8.20110823-alt0.M60P.1
php5-mbstring-5.3.8.20110823-alt0.M60P.1
php5-zip-5.3.8.20110823-alt0.M60P.1
php5-mcrypt-5.3.8.20110823-alt0.M60P.1
php-base-2.7-alt3
php5-suhosin-0.9.32.1-alt7.M60P.1
php5-gd2-5.3.8.20110823-alt0.M60P.1
apache2-mod_php5-5.3.8.20110823-alt1.M60P.1
php5-fileinfo-5.3.8.20110823-alt0.M60P.1
php5-ffmpeg-5.3.8.20110823-alt0.M60P.1
php5-pgsql-5.3.8.20110823-alt0.M60P.1.1
php5-bz2-5.3.8.20110823-alt0.M60P.1
php5-5.3.8.20110823-alt1.M60P.1

В какой-то момент случилось что-то(что и в какой момент - установить уже невозможно), из-за чего пхпшная функция finfo_open без второго аргумента не распознает типы файлов - у нее все octet-stream.

Например, вот такой код:

Код: Выделить всё

<?php
$filename="/opt/1/test.mkv";

$finfo = finfo_open(FILEINFO_MIME_TYPE,'/usr/share/file/magic');
echo finfo_file($finfo,$filename).PHP_EOL;
finfo_close($finfo);

$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo,$filename);


?>

возвращает:

Код: Выделить всё

video/x-matroska
application/octet-stream

Т.к. в действующем сайте код определения типа файлов находится во фреймворке, вариант с патчем кода откладывается на самое безвыходное положение.
Я нарыл документацию на функцию:
http://php.net/manual/ru/function.finfo-open.php
magic_file

Имя файла магической базы данных, обычно что-то наподобие этого: /path/to/magic.mime. Если не указан полный путь, будет использована переменная окружения MAGIC. Если эта переменная не указана, будет использован путь по умолчанию /usr/share/misc/magic. При необходимости добавляется суффикс .mime и/или .mgc.

Передача NULL или пустой строки эквивалентно значению по умолчанию.

Т.е. задание переменной окружения должна помочь.
И вправду, в консольке помогает:

Код: Выделить всё

$ export MAGIC=/usr/share/file/magic
$ php mimetest.php
video/x-matroska
video/x-matroska

Я подключил модуль mod_env в апач, добавил в определение vhost следующую строку:

Код: Выделить всё

SetEnv MAGIC /usr/share/file/magic

Перезапустил апач, но в итоге ситуация не поменялась.
при этом

Код: Выделить всё

$mag = getenv('MAGIC');
echo $mag

возвращает /usr/share/file/magic
То есть переменная нормально передается php, однако функция не отрабатывает как надо.

В связи с вышеописанным вопрос: Где я ошибся с определением переменной?
Также, есть еще и альтернативный способ: узнать, куда php смотрит на предмет magic database и сделать симлинк туда. Но как узнать, куда он смотрит? в документации сказано, что смотрит он в /usr/share/misc/magic, но симлинк туда не помог.
Может, есть еще какие-нибудь способы заставить работать функцию без второго аргумента?
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: apache2, mod_php: проблема с определением mime типа(finfo_open)

Сообщение sash-kan »

Bluetooth
может быть всё-таки бинарный файл нужен?
который называется /usr/share/file/magic.mgc
это, правда, не alt, но всё же:

Код: Выделить всё

$ file /usr/share/file/*
/usr/share/file/magic:          magic text file for file(1) cmd
/usr/share/file/magic.mgc:      magic binary file for file(1) cmd (version 4) (little endian)
/usr/share/file/magic.mime:     magic text file for file(1) cmd
/usr/share/file/magic.mime.mgc: magic binary file for file(1) cmd (version 4) (little endian)
$ ls -l /usr/share/file/
total 1592
-rw-r--r-- 1 root root  475773 2007-05-29 15:36 magic
-rw-r--r-- 1 root root 1040896 2007-05-29 15:36 magic.mgc
-rw-r--r-- 1 root root   32338 2007-05-29 15:36 magic.mime
-rw-r--r-- 1 root root   45312 2007-05-29 15:36 magic.mime.mgc
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Bluetooth
Сообщения: 4395
Статус: Блюзовый
ОС: Debian Squeeze amd64

Re: apache2, mod_php: проблема с определением mime типа(finfo_open)

Сообщение Bluetooth »

sash-kan писал(а):
24.02.2012 02:51
Bluetooth
может быть всё-таки бинарный файл нужен?
который называется /usr/share/file/magic.mgc

Разумеется, он. Смотрим доку:
Имя файла магической базы данных, обычно что-то наподобие этого: /path/to/magic.mime. Если не указан полный путь, будет использована переменная окружения MAGIC. Если эта переменная не указана, будет использован путь по умолчанию /usr/share/misc/magic. При необходимости добавляется суффикс .mime и/или .mgc.
Т.е. Суффикс добавляется сам. Видимо, рассчитано на лучшую переносимость. Короче говоря, /usr/share/file/magic - это правильно :)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: apache2, mod_php: проблема с определением mime типа(finfo_open)

Сообщение sash-kan »

смотрим доку:
A .mime and/or .mgc suffix is added if needed.
как и в русском переводе, присутствует неоднозначность — кому именно needed и кто именно added·

если у тебя в системе такие же файлы, как в приведённом мною примере, то существует и файл magic и файл magic.mgc
ты указываешь «magic», такой файл есть, его и пытается использовать php·
но что-то (особенно продемнстрированная тобой неработоспособность) мне подсказывает, что php-у нужен не plain-text-овый magic, а блоб по имени magic.mgc·
вот и попробуй «to add needed» суффикс, чтоб php пытался работать с блобом, а не с plain-text-ом·

если и так не заработает, придётся засучивать рукава и лезть в исходники·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: apache2, mod_php: проблема с определением mime типа(finfo_open)

Сообщение KiWi »

sash-kan писал(а):
24.02.2012 23:29
смотрим доку:
A .mime and/or .mgc suffix is added if needed.
как и в русском переводе, присутствует неоднозначность — кому именно needed и кто именно added·

Если его нет(то есть имя файла без .mime или .mgc на конце), то какой-то из них добавляется.
По крайней мере, я так понимаю эту фразу.

если и так не заработает, придётся засучивать рукава и лезть в исходники·

Зачем такие сложности?)
strace -e open
Спасибо сказали: