Подружить phpseclib и mbstring.func_overload=2
Столкнулся недавно с проблемой использования phpseclib (в составе библиотеки для Google API) на площадке у которой в параметрах прописано mbstring.func_overload=2. А для своей работы phpseclib требует, чтобы этот параметр был равен нулю (чтобы никаких переопределений стандартных функций не было). Выражается это требование в виде ошибки: "Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Overloading of string functions using mbstring.func_overload is not supported by phpseclib.'"
Изучение проблемы дало следующий результат. Универсального решения нет! Если библиотека требует такие параметры, то надо их поменять или не пользоваться ей. Однако, как и в жизни, есть поле для компромиссов.
- Если вам не критично именно такое значение, то его можно изменить в свойствах php. Это свойство должно меняться или в настройках php.ini, или в настройках хоста на уровне web-сервера, оно не может быть изменено через .htaccess (с PHP версии после 5.2.6).
- Если такое значение нужно какому-то проекту в рамках вашей площадки, но не нужно для сайта, где вы используете phpseclib, то можете изменить это свойство в параметрах виртуального хоста или даже дирректории:
<Directory "/path/to/your/site">
php_admin_value mbstring.func_overload 0
</Directory>
- Если у вас, как в моем случае, все завязано на одном проекте (например исопльзование Google API из БП Битрикс24) или нет доступа к настройкам PHP, то остается не так уж много вариантов:
- Сложный вариант - писать собственную "обвязку" вокруг Google API или выносить стандартный Google API на отдельную площадку и писать вокруг него свой API.
- Простой - закомментировать проверку этой функции в phpseclib (в файле bootstrap.php) и посмотреть заработает ли оно в такой конфигурации
Мне повезло, я был готов выносить вызов google api на отдельную площадку, но phpseclib заработал с mbstring.func_overload=2. И пока работает без нареканий. Подробную информацию что же именно завязано в этой библиотеке излагается в обсуждении на сайте разработчиков: https://github.com/phpseclib/phpseclib/issues/1239. Там один из разработчиков красочно описывает почему он считается жесткое требование по данному параметру оправданным, а также указывает, что именно может работать неправильно при несоответствии параметра.
|