Новое ядро и расширение mysqli
Как известно, используемое в продукте расширение mysql объявлено устаревшим в PHP 5.5.0. Поэтому в новом ядре было сразу предусмотрено использование актуального расширения mysqli. Но в одном из этапов разработки мы решили совместить старое и новое ядро в один жизненный цикл. Так как старое ядро не умело работать с mysqli, то и в новом его не получалось использовать.
И вот в обновлении ядра 14.5.2 добавлена полная поддержка mysqli. Включать mysqli нужно отдельно для старого и нового ядра:
'connections' => array ( 'value' => array ( 'default' => array ( 'className' => '\\Bitrix\\Main\\DB\\MysqliConnection', 'host' => 'localhost', 'database' => 'sitemanager', 'login' => 'root', 'password' => '*****', ), ), ),
Внимание , в php должно быть установлено расширение mysqli, дополнительные проверки на наличие расширения не производятся! Так же как они не делались для mysql.
Кроме того, в этом обновлении улучшилась совместимость с php 5.5 (исправлены регулярные выражения с модификатором «e»).
По дефолту поддержка расширения mysqli будет включаться в продукте? Если да, то когда?
P.S. Интересуют как новые версии, так и текущие установки (обновляемые).
Заготовка в инсталлере для новых установок уже есть. Хотим сначала убедиться, что все работает. Текущие версии — никогда, владелец проекта сам должен решить, что ему подходит лучше.
«Нет, Александр, так ты слона не продашь!»
Хотите сказать, что каждый владелец магазина должен разбираться в тонкостях?
Для тонкостей есть специалисты, которые без труда при необходимости все настроят.
Перехода на mysqli кроме разработчиков все-равно никто не заметит, а они вполне квалифицированы чтобы и решение принять и подключить все как нужно.
Андрей, а мне и не нужно никому продавать эту фишку
Это блог для разработчиков и фишку добавили для разработчиков.
Разработчик и сам знает нужен ли проекту mysqli и обоснует заказчику, если это действительно нужно. Можно даже заказчику не сообщать о таких тонкостях, они обычно даже и не особо хотят о таком знать и думать, есть задачи и поважнее.
Уже не раз столкнулся, что на хостинге стоит только mysqli, приходилось отдельно настраивать php. Теперь проблем меньше будет при установке Битрикса, что тоже радует.
Причем тут владелец проекта? Сейчас речь идет о коде 1С-Битрикс, вопрос к разработчикам Битрикс, даст ли это какой то плюс к их коду. Битрикс вообще не рекомендует напрямую обращаться к БД.
Когда владелец проекта решит, что ему нужны какие то доработки от своего программиста, он уже будет решать нужен ли ему mysqli, полезет ли он прямыми запросами к БД. А сейчас речь не идет о коде разработчика заказчика.
Пока преимуществ не наблюдается. Возможно, в будущем появится параметризация запросов, еще что-нибудь. Здесь больше внешний фактор роль играет: однажды php запретит старое расширение, нам нужно быть к этому готовыми.
Заметили такую ошибку ( причем уже как месяца 3 назад ): при переносе некоторых проектов,при загрузке сайт показывает белую страницу, ровно до тех пор, как мы в .settings не пропишем актуальные данные о подключении. Естественно, переменную в true никто не переводил. Как такое могло произойти?
Реквизиты от базы нужно прописывать в любом случае, при любом драйвере.
Неудобно, конечно, что теперь это нужно делать в двух местах, хорошо бы ядро брало настройки из dbconn.php и перезаписывало их из .settings.php при необходимости.
В старом расширении было так
'connections' => array ( 'value' => array ( 'default' => array ( 'className' => '\\Bitrix\\Main\\DB\\MysqlConnection', 'host' => 'localhost', 'database' => 'db', 'login' ='login', 'password' => '****', 'options' => 2, ), ), 'readonly' => true, ),
readonly — это атрибут любой опции (не только соединения), который говорит, что из API нельзя значение менять.
$this->dbOptions = intval($configuration['options']); if ($this->dbOptions < 0) $this->dbOptions = self::PERSISTENT | self::DEFERRED;
‘options’ => 2 говорит о том, что соединение персистентное и отложенное. И да, эти же параметры используются для MysqliConnection.
Вадим, при переходе на mysqli у нас в некоторых скриптах возникала ошибка при использовании CIBlockElement::SetPropertyValuesEx.
Api Битрикса почему-то думало что у нас свойства всегда хранятся отдельно, искало инфоблок и не находило его, выдавая ошибку.
MySQL Query Error: SEL ECT * FR OM `b_iblock_element_prop_s3` LIMIT 0 [[1146] Table ‘b_iblock_element_prop_s3’ doesn’t exist]Это действительно ошибка или может при переходе на mysqli планируете сразу инфоблоки2.0 сделать по-умолчанию?
Вадим, может стоит этот фикс еще в restore.php добавить? А то не понимал почему не заводится бекап, вроде копия свежая. Этот пост как-то забыл.
Антон, давай подробности, не понимаю, о чем разговор.
Вадим, тикет 623830. Суть в том, что распаковал бекап на более свежем PHP, и выдалась фатальная ошибка PHP. Техподдержка что-то поправила (по сути вставила константу) — и все завелось. Вот и предлагаю научить restore.php самому подставлять необходимую константу при надобности.
В тикете ТП сделала описанные действия в этом посте.
Я завел лишь речь о том, чтобы делать это автоматически.
Имхо было бы неплохо mysqli автоматически включать в новых версиях окружения 5.1.3+. Сейчас для этого нужно в /etc/php.d найти mysqli.ini.disabled и переименовать например в mysqli.ini
или в файл mysqli.ini добавить
; Enable mysqli extension module extension=mysqli.so
и перезагрузить apache. имеет смысл в новых версиях окружения mysqli иметь по умолчанию включенным, ведь новая версия окружения уже предлагает установить php 5.6.
[ErrorException] E_DEPRECATEDmysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead (0)/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:45
#0: mysql_connect(string, string, string, boolean)
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:45
#1: Bitrix\Main\DB\MysqlConnection->connectInternal()
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:103
#2: Bitrix\Main\DB\MysqlConnection->queryInternal(string, array, NULL)
/home/bitrix/www/bitrix/modules/main/lib/db/connection.php:329
#3: Bitrix\Main\DB\Connection->query(string)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:183
#4: Bitrix\Main\Config\Option::load(string, NULL)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:53
#5: Bitrix\Main\Config\Option::get(string, string, string)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:337
#6: Bitrix\Main\HttpRequest->prepareCookie(array)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:63
#7: Bitrix\Main\HttpRequest->__construct(object, array, array, array, array)
/home/bitrix/www/bitrix/modules/main/lib/httpapplication.php:43
#8: Bitrix\Main\HttpApplication->initializeContext(array)
/home/bitrix/www/bitrix/modules/main/lib/application.php:122
#9: Bitrix\Main\Application->initializeExtendedKernel(array)
/home/bitrix/www/bitrix/modules/main/include.php:24
#10: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog_before.php:14
#11: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog.php:10
#12: require_once(string)
/home/bitrix/www/bitrix/header.php:1
#13: require(string)
/home/bitrix/www/index.php:2
У меня такая же проблема ловлю Exception хотя всё настраивал по мануалу.
Трассировка Execption-ов говорит, что да попытка использования mysqli в коде просматривается.
Но по какой-то причине не воспринимается параметр options.
[Error] Call to undefined function Bitrix\Main\DB\mysql_connect() (0) /home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:45 #0: Bitrix\Main\DB\MysqlConnection->connectInternal() /home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:103 #1: Bitrix\Main\DB\MysqlConnection->queryInternal(string, array, NULL) /home/bitrix/www/bitrix/modules/main/lib/db/connection.php:329 #2: Bitrix\Main\DB\Connection->query(string) /home/bitrix/www/bitrix/modules/main/lib/config/option.php:182 #3: Bitrix\Main\Config\Option::load(string, NULL) /home/bitrix/www/bitrix/modules/main/lib/config/option.php:53 #4: Bitrix\Main\Config\Option::get(string, string, string) /home/bitrix/www/bitrix/modules/main/lib/httprequest.php:337 #5: Bitrix\Main\HttpRequest->prepareCookie(array) /home/bitrix/www/bitrix/modules/main/lib/httprequest.php:63 #6: Bitrix\Main\HttpRequest->__construct(object, array, array, array, array) /home/bitrix/www/bitrix/modules/main/lib/httpapplication.php:42 #7: Bitrix\Main\HttpApplication->initializeContext(array) /home/bitrix/www/bitrix/modules/main/lib/application.php:122 #8: Bitrix\Main\Application->initializeExtendedKernel(array) /home/bitrix/www/bitrix/modules/main/include.php:23 #9: require_once(string) /home/bitrix/www/bitrix/modules/main/include/prolog_before.php:14 #10: require_once(string) /home/bitrix/www/bitrix/modules/main/include/prolog.php:10 #11: require_once(string) /home/bitrix/www/bitrix/header.php:1 #12: require(string) /home/bitrix/www/index.php:2
Модуль проактивной защиты отключить как?
Добрый день подскажите пожалуйста включил содуль проактивной защиты в админ панеле как его отключить?немогу войти в админ панель и на сайт ошибка Fatal error: Call to undefined function mb_strlen() in /home/berendeevo/berendeevo.ru/docs/bitrix/modules/security/classes/general/antivirus.php on line 488
Подскажите подробнее как его отключить есть доступ только к ФТП в админ панеле пишет такую же ошибку.
вам нужен доступ в базу данных, например, через MySQL. Если его нет, то можете написать простенький скриптик, выполняющий подключение к БД и 1 простой запрос: DELETE FR OM b_module WH ERE `ID`=’security’ .
способ, предложенный Алексанжром, не помог — решить смог так:
закомментил в файле bitrix/modules/main/include.php 316-317 строчки, зашел в админке в проактивную защиту, добавил свой айпи, раскомментил строчки
надеюсь кому-нибудь пригодится
Закомментировал эти строчки:
foreach (GetModuleEvents("main", "OnPageStart", true) as $arEvent) ExecuteModuleEventEx($arEvent);
Закомментировал эти строчки:
foreach (GetModuleEvents( "main" , "OnPageStart" , true ) as $arEvent ) ExecuteModuleEventEx( $arEvent );
Цитата |
---|
написал: Закомментировал эти строчки:Кодforeach (GetModuleEvents(«main», «OnPageStart», true) as $arEvent) ExecuteModuleEventEx($arEvent); |
Спасибо! Мне также это помогло при решении проблемы с ограничением по хостам/доменам в проактивной защите.
Данный код в текущей версии ядра Битрикс находился уже на других строках.Ориентироваться нужно при поиске на событие OnPageStart
В настройках проактивной защиты пришлось указать localhost, хотя обращение к сайту идёт по тестовому домену. Без этого настройки не сохраняются, появляется сообщение
Хотя в переменных $_SERVER всё ОК
$_SERVER[HTTP_HOST]=>тестовый домен
$_SERVER[SERVER_ADDR] => 127.0.0.1
Продукты
Управление сайтом
Битрикс24
Интернет-магазин + CRM
Решения
Для интернет-магазинов
Каталог готовых решений
Внедрение
Выбрать партнера
Проверить партнера
Стать партнером
1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507
© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности