get_browser() возвращает FALSE

- Запуск PHP 5.3.8 в Linux

Для начала мы решили эту проблему до такой степени, что функция возвращает ожидаемые значения. Тем не менее, у меня все еще остается много вопросов без ответов, и "решение" - это скорее обходной путь, чем все остальное.

Я потратил большую часть дня на эту проблему, так что терпите меня, когда я объясняю, что было сделано. Для начала проблема в том, что возвращаемое значение get_browser() является FALSE, который не является документированным возвращаемым значением. Это заставляет меня предположить, что FALSE возвращение означает какое-то состояние ошибки внутри функции.

После многих итераций тестовый код стал простым var_dump(get_browser($agent, true)), Я запустил тесты с передачей как строки агента пользователя, так и без аргументов, например var_dump(get_browser()), что у всех были одинаковые возвращаемые значения.

Что было проверено / проверено без изменения возвращаемого значения:

browscap.ini:

  • Имейте последнюю версию, также проверил несколько предыдущих версий

Разрешения:

  • bowscap.ini - Первоначальные разрешения были 644, но я пробовал все с 644-777

  • Каталог, содержащий browscap.ini - Первоначальные разрешения были 755, пробовал также 777

  • Проверено, что PHP может получить доступ к файлу и каталогу с помощью других функций, таких как file()

Пользовательский агент

  • Попытка передачи строки пользовательского агента вручную

  • Попытка передачи $_SERVER['HTTP_USER_AGENT']

  • Подтвердил строку моего пользовательского агента с другом в далекой стране - get_browser() возвращенные значения, как и ожидалось.

php.ini

  • Настройка browscap указывает на правильное местоположение

  • проверено снова с echo count(file(ini_get('browscap')));

Журналы ошибок

  • Проверенные журналы ошибок PHP и Apache для любого упоминания о 'browscap' или чем-то даже близко связанном - ничего необычного.

Файловая структура

Это где я подозреваю, что ошибка происходит. browscap.ini живет в /var/php/, который имеет подходящие разрешения, как указано выше. Я думал, что, возможно, PHP не может получить доступ к этому каталогу, или что-то в этом роде. Тем не менее, в этом каталоге также хранятся сессии, так что это становится менее вероятным.

РЕШЕНИЕ"

Решением этой проблемы стало перемещение browscap.ini в общедоступный веб-каталог. Мне любопытно, почему это так, особенно учитывая недокументированное возвращаемое значение. "Решение" работает, но это не решение, которое я думал, что найду...

Есть ли get_browser() есть особые требования к разрешениям или что-то подобное? file() может получить доступ к каталогу и файлу просто отлично, но get_browser() не мог (предположительно). Я практически вырвал свои волосы из-за этой проблемы и хотел бы получить какое-то решение!

Спасибо за прочтение!

3 ответа

Решение

На самом деле, даже не документированные на странице руководства, get_browser функция может вернуться FALSE по нескольким причинам.

По крайней мере, загляните в исходный код, который можно предположить.

Я предлагаю вам взглянуть туда, а затем дайте мне знать, если у вас есть дополнительные вопросы. Я мог бы ответить на них тогда.

Вы пробовали каждый требуемый метод.

http://php.net/manual/en/function.get-browser.php с примечанием:

Чтобы это работало, ваш параметр конфигурации browscap в php.ini должен указывать на правильное расположение файла browscap.ini в вашей системе.

browscap.ini не поставляется с PHP, но вы можете найти актуальный файл "php_browscap.ini здесь.

Несмотря на то, что browscap.ini содержит информацию о многих браузерах, он поддерживает обновления пользователей для поддержания актуальности базы данных. Формат файла довольно понятен.

What solved the issue was moving browscap.ini to the public web directory. 

Это может указывать на это место. т.е. общедоступный веб-каталог

Does get_browser() have special permissions requirements, or anything like that? 

Разрешения на чтение требуются только.

У меня была та же самая проблема как оригинальный плакат. Решение? php.ini требуется абсолютный путь к файлу browscap.ini.

Таким образом, хотя PHP нашел файл и он появился в phpinfo()В результате возникла следующая строка:

browscap = browscap.ini

С этой линией getBrowser() возвращенный false,

Однако изменение его на абсолютный путь сработало, например, так:

browscap = /etc/browscap.ini

Надеюсь, это поможет кому-то! Это странно...

Другие вопросы по тегам