Перейти к содержимому


Правила форума

Внимание!!! Если не можете скачать, пожалуйста ознакомьтесь с условиями получения доступа с файлам форума. Правила форума


Обновление shopcms для работы на версии php 5.4 +

php5.4

Сообщений в теме: 65

#41 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 06 ноября 2017 - 16:26

Такого и подобного целый список:
Methods with the same name as their class will not be constructors in a future version of PHP; JsHttpRequest has a deprecated constructor in class.ajax.php

#42 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 06 ноября 2017 - 17:08

Цитата

там было не все готово еще, думал, может подскажет кто...
А что тут подсказывать?
1. вызовов db_connect() в ShopCMS немного - install, admin, index. Ну и config в fckeditor.
Причем он штатно возвращает $db_link и без переделок.
Т.е. db_connect() особо править и не надо, только заменить mysql на mysqli.
2. Чтобы $db_link попал в остальные функции надо, чтобы область действия этой переменной (или константы, почему бы нет) была шире, чем пределы функции. В PHP 4 и 5 область действия либо "внутри функции", либо "ваще везде", других нет (если не касаться классов). Т.е. надо создать вот такое "ваще везде" со значением $db_link.
3. Вариантов "ваще везде" в PHP 4 и 5 тоже два. Это GLOBAL для переменных и define() для констант.
Т.е. либо объявляем в db_connect() и остальных db_функциях переменную $db_link как GLOBAL, либо как константу через define()
define ('DB_LINK', db_connect(...));
mysqli_select_db(DB_LINK, ...);
mysqli_query(DB_LINK, ...);


PS.
1. Это мои теоретические размышления. Чего-то могу не знать, чего-то не заметить или не сообразить.
2. GLOBAL как великую кривизну давно хотят вообще убрать, заменив какими-то другими механизмами. Может, в 7.0 уже и убрали, не в курсе.
Т.е. мной написанное это всего лишь то, что бы делал я начав перелопачивать ShopCMS под mysqli.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#43 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 06 ноября 2017 - 20:06

Перелопатил пока как-то так:
Прикрепленный файл  mysqli.php   8,36К   5 Количество загрузок:

#44 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 07 ноября 2017 - 10:00

Теперь вот эта часть кода в функции db_query($s) постоянно выдает ошибку (даже при очистке журнала ошибок)
while($xwer = @mysqli_fetch_field($res["resource"])){
ошибка:
WARNING: mysqli_fetch_field() expects parameter 1 to be mysqli_result, boolean given

#45 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 07 ноября 2017 - 15:23

Ошибка в классе class.ajax.php
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP;
Исправляется заменой
//function JsHttpRequest($enc)
public function __construct($enc)
в xml_parser.php
//function XmlNode()
public function __contruct()


#46 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 07 ноября 2017 - 16:01

Цитата

//$JsHttpRequest = new Js_Http_Request('cp1251');
$JsHttpRequest = new Js_Http_Request(DEFAULT_CHARSET);
Хм.. А в чем смысл этой замены, если штатно DEFAULT_CHARSET это и есть 'cp1251'?
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#47 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 07 ноября 2017 - 16:27

Нет, нет так, надо:
//function JsHttpRequest($enc)
public function __construct($enc)
В остальных местах не трогаем.
(исправил предыдущий пост)

Аналогично нужно исправить конструкторы во всех классах и классы в файлах crypto_functions.php и xml_parser.php

#48 Robby

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 162 сообщений
Репутация: 75
Продвинутый

Отправлено 07 ноября 2017 - 20:38

Salp,
попробуйте использовать универсальное решение Class: PHP MySQL to MySQLi. Можно использовать не только с ShopCMS
Прикрепленный файл  mydql2i-2017-09-06.zip   4,44К   4 Количество загрузок:

1. Поместить два файла в корень сайта
mysql2i.class.php
mysql2i.func.php

2. Добавить
include_once('mysql2i.class.php');
в начало файлов
admin.php
index.php
install.php

#49 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 08 ноября 2017 - 09:19

Спасибо! Попробую, но, это, наверное, снизит производительность, а переход на MySQLi уже практически завершен.
Остались такие ошибки в логах:
WARNING: mysqli_fetch_field() expects parameter 1 to be mysqli_result, boolean given

Товары в магазине отображаются, варнинги не сыпятся, админка почти полностью работает, корзнина пока не добавляет товары, но это временно )))

#50 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 08 ноября 2017 - 11:50

Попробовал Class: PHP MySQL to MySQLi
В целом - работает.
Не хуже чем, с полной переделкой всех запросов на MySQLi.
Скорость работы с этим решением почти не отличается от полной переделки - 1-2%.

Наблюдаю ошибки в логах (библиотека не самая свежая?):
WARNING: mysqli_fetch_field() expects parameter 1 to be mysqli_result, boolean given
Line: 168
File: /mysql2i.class.php
Корзина по-прежнему при добавлении товара(при залогиненом пользователе) пуста.
Если разлогиниться, товары добавляются.

#51 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 08 ноября 2017 - 14:00

Просмотр сообщенияSalp сказал:

Наблюдаю ошибки в логах (библиотека не самая свежая?):
WARNING: mysqli_fetch_field() expects parameter 1 to be mysqli_result, boolean given
в mysqli_fetch_field (т.е. исходно в mysql_fetch_field) передается результат выполнения mysqli_query (исходно mysql_query и db_query). Этим результатом может быть либо mysqli_result в случае нормального запроса, либо false (т.е. boolean) в случае некорректного запроса.
Там же в WARNINGе так и написано - "вместо параметра 1, который должен быть типа mysqli_result представлен параметр типа boolеan"
Библиотека тут, скорее всего, ни при чем.
Ищите, где у вас SQL-запрос вместо результата возвращает false.

Цитата

2. Добавить
include_once('mysql2i.class.php');
в начало файлов
admin.php
index.php
install.php
Не проще ли добавить в одно место - в mysql.php? :)
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#52 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 08 ноября 2017 - 16:05

Просмотр сообщенияbadisoft сказал:

Ищите, где у вас SQL-запрос вместо результата возвращает false.
Ищу... Этот же магазин на php 5.6 с MySQL работает без единой ошибки.
Ошибки появляется при переходе на MySQLi даже без смены версии php

#53 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 08 ноября 2017 - 17:48

Цитата

Этот же магазин на php 5.6 с MySQL работает без единой ошибки.
Это ни о чем не говорит. Во-первых, оно не ошибка, а warning. Во-вторых, функции-то разные. В фукциях mysql такая ситуация (не тот тип данных в параметрах функции) может просто не отрабатываться как warning. А в mysqli - отрабатываться. Ведь отличие warning от error в том и состоит, что, как правило, error это заведомо некорректное дальнейшее продолжение, даже если оно возможно. А warning обычно вполне позволяет продолжение, несмотря на какую-то некорректность. Наиболее явно это видно с foreach. До 5.3 warning-а "подсунут не массив, а что-то другое" вообще не было. Ну, не массив, так и цикл по нему выполнять не будем. И все. А с 5.3 появились по этому поводу warning-и, которых несколько даже в штатном "из коробки" ShopCMS.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#54 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 09 ноября 2017 - 02:42

Просмотр сообщенияbadisoft сказал:

Этим результатом может быть либо mysqli_result в случае нормального запроса, либо false (т.е. boolean) в случае некорректного запроса.
самое интересное, что удалось выловить не false, а true и отдает его запрос (что есть полный бред):
select settings_constant_name, settings_value from settings
вот это поворот

Просмотр сообщенияbadisoft сказал:

Это ни о чем не говорит. Во-первых, оно не ошибка, а warning.
Это понятно. Но 800 таких варнингов, записанных в лог, при заходе на главную, существенно замедляют загрузку этой страницы.
Поэтому желательно их выловить.

#55 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 09 ноября 2017 - 19:06

Просмотр сообщенияSalp сказал:

Ошибка в классе class.ajax.php Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP;
Исправляется заменой //function JsHttpRequest($enc) public function __construct($enc)
Аналогично нужно исправить конструкторы во всех классах и класс в файле crypto_functions.php
Также ОБЯЗАТЕЛЬНО нужно исправить вызовы этого конструктора:
в class.virtual.paymentmodule.php
//virtualModule::virtualModule($_ModuleConfigID);
virtualModule::_construct($_ModuleConfigID);
в class.virtual.shippingratecalculator.php
//virtualModule::virtualModule($_ModuleConfigID);
virtualModule::_construct($_ModuleConfigID);


#56 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 09 ноября 2017 - 19:33

Цитата

Так ОБЯЗАТЕЛЬНО нужно исправить:
Это довольно логично вытекает из уже обсужденного (?) запрета иметь одинаковое название класса и метода.
Т.е. код Вася::Вася() для 7.0 заведомо некорректен.
Хотя логика этого решения и не понятна.
Почему? Зачем? Что не так в одноименности?
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#57 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 10 ноября 2017 - 16:08

Итак, работает практически все (в т.ч. и корзина), варнинги еще сыпятся, но это это дело времени.
Ускорения от перехода на PHP7 не замечаю.
Возможно, из-за заполнения логов ошибок (на главной странице, например, из-за этого количество запросов в 2 раза больше, чем на PHP5.6)
предупреждение
WARNING: mysqli_fetch_field() expects parameter 1 to be mysqli_result, boolean given
закрыл в mysqli.php пока так:
if (!is_bool($res["resource"])) while($xwer = @mysqli_fetch_field($res["resource"])){
Даже при входе в раздел "Статистика ошибок" появляется такое:
WARNING: Unknown: Session callback expects true/false return value
Line: 0
File: Unknown
Link: /admin.php?dpt=reports&sub=security
Date: 10.11.17 - 16:02:32
Dump:
array (
  'dpt' => 'reports',
  'sub' => 'security',
  'security_error_logs_warn' => 'delete',
)
---
WARNING: Unknown: Failed to write session data using user defined save handler. (session.save_path: /.system/tmp)
Line: 0
File: Unknown
Link: /admin.php?dpt=reports&sub=security
Date: 10.11.17 - 16:02:32
Dump:
array (
  'dpt' => 'reports',
  'sub' => 'security',
  'security_error_logs_warn' => 'delete',
)
---
WARNING: Unknown: Session callback expects true/false return value
Line: 0
File: Unknown
Link: /index.php?PHPSESSID=e73fe1e8465a716a182898d7609cda42&do=stat&JsHttpRequest=15103225523670-script
Date: 10.11.17 - 16:02:33
Dump:
array (
  'menu6' => '1',
  'menu5' => '1',
  'PHPSESSID' => 'e73fe1e8465a716a182898d7609cda42',
  'do' => 'stat',
)
---
WARNING: Unknown: Failed to write session data using user defined save handler. (session.save_path: /.system/tmp)
Line: 0
File: Unknown
Link: /index.php?PHPSESSID=e73fe1e8465a716a182898d7609cda42&do=stat&JsHttpRequest=15103225523670-script
Date: 10.11.17 - 16:02:33
Dump:
array (
  'menu6' => '1',
  'menu5' => '1',
  'PHPSESSID' => 'e73fe1e8465a716a182898d7609cda42',
  'do' => 'stat',
)
---


#58 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 10 ноября 2017 - 16:26

Цитата

Session callback expects true/false return value
Как я понимаю, заменители штатных функций работы с сессией должны возвращать true/false о результате выполнения.
Но если посмотреть в session_functions.php, то там куча функций не возвращают ничего, т.е. вообще не имеют return ??? в конце.
Думаю, прописывание там (по минимуму) return true или (по максимуму) "return реальный результат операции" решит проблему.
Подчеркиваю, это я все теоретически, нет у меня PHP 7.0.

PS. (чуть позже) Видимо, надо прописать return true в функции sess_write и sess_gc, т.к. выполняемые там запросы не могут быть "неудачными" (если только серверу не совсем каюк).
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#59 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 213 сообщений
Репутация: 54
Продвинутый

Отправлено 10 ноября 2017 - 17:56

Отлично! Большая часть предупреждений ушла.
Далее, для исключения предупреждений вида (они все аналогичные):
WARNING: Declaration of CShippingModuleByCountryByZonePercent::allow_shipping_to_address($address) should be compatible with ShippingRateCalculator::allow_shipping_to_address()
Line: 348
File: /core/modules/shipping/rate_bycountry_byzone_percent.php
Link: /index.php?order2_shipping=yes&shippingAddressID=1
Date: 11.11.17 - 10:20:07
Dump:
array (
  'order2_shipping' => 'yes',
  'shippingAddressID' => '1',
)
в fixed_shipping_rate.php, fixed_shipping_rate_plus_percent.php, fixed_shipping_rate_xor_percent.php, rate_bycountry_byzone.php, rate_bycountry_byzone_percent.php
заменить:
//function calculate_shipping_rate($order, $address) {
function calculate_shipping_rate($order, $address, $_shServiceID = 0) {

в class.virtual.shippingratecalculator.php
//function allow_shipping_to_address(){
function allow_shipping_to_address($address){

в class.courier.php (в двух местах) и в class.courier2.php (в двух местах) меняем:
_getRates()
на
_getRates($_Services, $order, $address)

в class.virtual.shippingratecalculator.php
//function _getRates(&$_Services,  $order, $address){
function _getRates($_Services,  $order, $address){


#60 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 10 ноября 2017 - 19:38

Цитата

//function allow_shipping_to_address()
function allow_shipping_to_address($address)
Было бы здорово, если бы Вы писали ПОЧЕМУ так надо сделать.
Т.е. что такого изменилось в 7.0, что потребовало этой коррекции кода.
Оно не только про эту строчку, а вообще.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)