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


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

php5.4

  • Вы не можете ответить в тему
Сообщений в теме: 70

#41 Salp

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

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

Отправлено 06 November 2017 - 04:26 PM

Такого и подобного целый список:
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
  • 0

#42 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 06 November 2017 - 05:08 PM

там было не все готово еще, думал, может подскажет кто...

А что тут подсказывать?
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.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#43 Salp

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

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

Отправлено 06 November 2017 - 08:06 PM

Перелопатил пока как-то так:
Прикрепленный файл  mysqli.php   8.36К   12 Количество загрузок:
  • 1

#44 Salp

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

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

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

Теперь вот эта часть кода в функции db_query($s) постоянно выдает ошибку (даже при очистке журнала ошибок)
while($xwer = @mysqli_fetch_field($res["resource"])){

ошибка:
WARNING: mysqli_fetch_field() expects parameter 1 to be mysqli_result, boolean given
  • 0

#45 Salp

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

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

Отправлено 07 November 2017 - 03:23 PM

Ошибка в классе 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()

  • 0

#46 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 November 2017 - 04:01 PM

//$JsHttpRequest = new Js_Http_Request('cp1251');
$JsHttpRequest = new Js_Http_Request(DEFAULT_CHARSET);

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

#47 Salp

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

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

Отправлено 07 November 2017 - 04:27 PM

Нет, нет так, надо:
//function JsHttpRequest($enc)
public function __construct($enc)

В остальных местах не трогаем.
(исправил предыдущий пост)

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

#48 Robby

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

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

Отправлено 07 November 2017 - 08:38 PM

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

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

2. Добавить
include_once('mysql2i.class.php');

в начало файлов
admin.php
index.php
install.php
  • 1

#49 Salp

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

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

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

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

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

#50 Salp

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

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

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

Попробовал 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

Корзина по-прежнему при добавлении товара(при залогиненом пользователе) пуста.
Если разлогиниться, товары добавляются.
  • 0

#51 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 November 2017 - 02:00 PM

Наблюдаю ошибки в логах (библиотека не самая свежая?):
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? :)
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#52 Salp

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

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

Отправлено 08 November 2017 - 04:05 PM

Ищите, где у вас SQL-запрос вместо результата возвращает false.

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

#53 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 November 2017 - 05:48 PM

Этот же магазин на php 5.6 с MySQL работает без единой ошибки.

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

#54 Salp

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

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

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

Этим результатом может быть либо mysqli_result в случае нормального запроса, либо false (т.е. boolean) в случае некорректного запроса.

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

вот это поворот

Это ни о чем не говорит. Во-первых, оно не ошибка, а warning.

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

#55 Salp

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

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

Отправлено 09 November 2017 - 07:06 PM

Ошибка в классе 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);

  • 0

#56 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 09 November 2017 - 07:33 PM

Так ОБЯЗАТЕЛЬНО нужно исправить:

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

#57 Salp

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

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

Отправлено 10 November 2017 - 04:08 PM

Итак, работает практически все (в т.ч. и корзина), варнинги еще сыпятся, но это это дело времени.
Ускорения от перехода на 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',
)
---

  • 0

#58 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 10 November 2017 - 04:26 PM

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, т.к. выполняемые там запросы не могут быть "неудачными" (если только серверу не совсем каюк).
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#59 Salp

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

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

Отправлено 10 November 2017 - 05:56 PM

Отлично! Большая часть предупреждений ушла.
Далее, для исключения предупреждений вида (они все аналогичные):
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){

  • 0

#60 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 10 November 2017 - 07:38 PM

//function allow_shipping_to_address()
function allow_shipping_to_address($address)

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