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


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

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


ShopCMS и PHP7


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

#1 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 29 марта 2018 - 16:22

Дошли у меня руки проинсталлить сервер с PHP7.1.
Заодно решил посмотреть, а что же такого страшного в PHP7 для ShopCMS.
Раскатал ShopCMS 3.1.3 и начал его инсталлировать, исправляя по ходу процесса появляющиеся ошибки.
Все оказалось на удивление не сложно.

Основные моменты:

1. Надо добавить отсутствующие в PHP7, но использующися в ShopCMS функции.
Их не так и много (аж пять). Создаем файлик /core/functions/deleted_function.php и пишем туда заменители функций.

2. заменить класс (и одноименный каталог) asido на более новый.

3. Скачать со smarty.net последнюю версию smarty 2.6.* (сейчас это 2.6.31), исправленную под PHP7 и заменить ею старую.

4. перенести в новую версию smarty настройки из старой и смарти-функцию hassign.

5. добавить библиотеку "MySQL to MySQLi" (эмулятор mysql-фукций через mysqli-функции). Два файла в /core/includes/database/ и две строки в mysql.php

6. исправить конструкторы классов, где они одноименные с именем класса. .
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP;

7. прописать для PHP значение default_charset cp1251. Хоть в htaccess, хоть в php.ini, хоть еще где. Я прописывал в nginx.conf, т.к. использую nginx. Это задаст нужную кодировку для функций htmlspecialchars и html_entity_decode

8. убрать передачу по ссылке &new везде, где она есть

9. еще несколько мелочей, которые дают warning, а не error и легко фиксятся исходя из текста в "Статистике ошибок"

Все. Процедура меньше, чем на десять шагов. Заняла неспешно один день. Не понимаю, о чем не так давно ломались копья чуть не две недели.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 05 апреля 2018 - 15:21

Цитата

3. Скачать со smarty.net последнюю версию smarty 2.6.* (сейчас это 2.6.31), исправленную под PHP7 и заменить ею старую.
А вот под PHP 5.2 обновлять версию smarty на 2.6.31(последнюю на текущий момент) не стоит.
Перестает работать как минимум {count}

PS. Хм... Надо проверить, может в этой версии {count} и на PHP7 не работает. :)
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#3 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 05 апреля 2018 - 19:09

Цитата

Хм... Надо проверить, может в этой версии {count} и на PHP7 не работает.
Печалько.. Не работает и в PHP7. А ведь {count} довольно много где используется в ShopCMS.
Придется:
-либо ждать исправления (не знаю, как написать об этой проблеме авторам)
-либо откатываться на какую-то предыдущую версию 2.6.*, которая уже переделана под PHP7, но еще не имеет проблемы с {count}
-либо переходить на smarty3 (предполагая, что там {count} работает). но это куда болезненнее, чем просто заменить библиотеку smarty2 на более новую
-либо самому разбираться, в чем проблема и почему не работает {count}. Видимо, этот путь будет наиболее быстрым :(.

Позже:

Ээээ... собственно, строка, вызывающая проблему такова:
{count item=_CostsNum array=$shipping_costs[i]}
и находится она в order2_shipping.tpl.html и order2_shipping_quick.tpl.html, product_tree.tpl.html.
Похоже, я ее попутал с {counter} - штатной функцией smarty.

Отсюда вопрос - а что это вообще за функция? Я не вижу ее в документации по Смарти.

Еще позже:

Цитата

-либо самому разбираться, в чем проблема и почему не работает {count}.
Йееее! Так и оказалось! Это плагин function.count.php, которого нет в штатном smarty, но который есть в shopCMS.
Алилуйя, все снова работает :).
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 webvertex

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий

Отправлено 10 апреля 2018 - 23:26

Цитата

1. Надо добавить отсутствующие в PHP7, но использующися в ShopCMS функции.
Их не так и много (аж пять). Создаем файлик /core/functions/deleted_function.php и пишем туда заменители функций.
А если не секрет, какие пять использующихся в ShopCMS функций Вы нашли удалённых в PHP7?
1. ereg (setting_functions.php, catalog_excel_export.php, conf_blocks_edit.php)

(https://wiki.php.net...cations_php_7_2)

#5 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 11 апреля 2018 - 08:16

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

какие пять использующихся в ShopCMS функций Вы нашли удалённых в PHP7?
session_unregister - deprecated в 5.3, убранo в 5.4
session_register - deprecated в 5.3, убранo в 5.4
session_is_registered - deprecated в 5.3, убранo в 5.4
ereg - deprecated в 5.4, убранo в 7.0
eregi - deprecated в 5.4, убранo в 7.0
split - deprecated в 5.3, убранo в 7.0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#6 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 11 апреля 2018 - 16:20

Файлик deleted_functions.php, который очень полезен при переходе на PHP7 :)

<?php
if (!function_exists('session_unregister')) // deprecated в 5.3, убранo в 5.4
{
function session_unregister($var)
    {
    unset($_SESSION[$var]);
    return true;
    }
}

if (!function_exists('session_register')) // deprecated в 5.3, убранo в 5.4
{
function session_register($var)
    {
    $_SESSION[$var];
    return true;
    }
}

if (!function_exists('session_is_registered')) // deprecated в 5.3, убранo в 5.4
{
function session_is_registered($var)
    {
    return isset($_SESSION[$var]);
    }
}

if (!function_exists('ereg')) // deprecated в 5.4, убранo в 7.0
{
function ereg($tpl,$var)
    {
    return preg_match('/'.$tpl.'/',$var);
    }
}

if (!function_exists('eregi')) // deprecated в 5.4, убранo в 7.0
{
function eregi($tpl,$var1,$var2)
    {
    return preg_match('/'.$tpl.'/i',$var1,$var2);
    }
}

if (!function_exists('split')) // deprecated в 5.3, убранo в 7.0
{
function split ($pattern, $string, $limit = -1, $flags = 0)
    {
    return preg_split ('/'.$pattern.'/', $string, $limit, $flags);
    }
}
?>


http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#7 webvertex

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий

Отправлено 11 апреля 2018 - 19:05

Спасибо большое!
Мы пошли по более сложному пути - убрали или исправили эти функции в исходных файлах :-)

#8 webvertex

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий

Отправлено 26 апреля 2018 - 22:17

А кто сталкивался с такими многочисленными предупреждениями в Разделе "Статистика ошибок":

WARNING: Unknown: Session callback expects true/false return value
Line: 0
File: Unknown

WARNING: Unknown: Failed to write session data using user defined save handler. (session.save_path: /home/b/boloto2g/boloto2g.beget.tech/public_html/temp/)
Line: 0
File: Unknown

Хотя в последнем случае путь существует и имеет права 777.
(Слеш в конце и убирали, и ставили - не помогает)

Перевод самой ошибки понятен :-) - непонятно, где исправлять! (На PHP7)

#9 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 27 апреля 2018 - 10:59

Цитата

WARNING: Unknown: Session callback expects true/false return value
8. в файле session_functions.php в функции write и gc в конец вставляем
return true;


Цитата

WARNING: Unknown: Failed to write session data using user defined save handler. (session.save_path: /home/b/boloto2g/boloto2g.beget.tech/public_html/temp/)
Это очень странное сообщение.
"Невозможно записать данные сессии в некий файл по некому пути."
Но в shopCMS данные сессии не сохраняются дефолтовым способом в файле, а используется
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");

заменяющий функции работы с сессией своими, где данные хранятся в sql-таблице.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#10 webvertex

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий

Отправлено 27 апреля 2018 - 23:16

Спасибо большое!
Ошибки с сессией прекратились. Обе :-)

#11 antaNT

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

  • Download User
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 24 августа 2018 - 13:48

может кому не жалко smarty которое под php7 работает ?

#12 R.Sergey

    Администратор

  • Администраторы
  • 2 774 сообщений
Репутация: 329
Мастер

Отправлено 24 августа 2018 - 16:39

любой smarty работает под php7

#13 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 24 августа 2018 - 20:56

Цитата

может кому не жалко smarty которое под php7 работает ?
Эээ... Вы удивляете беспомощностью. Если набрать в поисковике "smarty", то обязательно вылезет википедия со статье о смарти, где есть ссылка на сайт разработчиков, где есть ссылка на последний релиз второй версии smarty (на текущий момент это 2.6.31) на гитхабе. Ссылка бесплатна. Странный путь через википедию только для того, чтобы попасть на сайт именно разработчиков.

Цитата

любой smarty работает под php7
7.0 я не проверял, а под 7.2 штатный, который "из коробки" местами не работает, насколько я помню. Конкретика уже забыта, увы.

PS.Может, проблема вовсе не в smarty? Штатный Smarty (насколько я помню) под PHP7 худо-бедно работает (что-то не работает, но основа вполне показывется) и проблема обычно вовсе не в нем. В ShopCMS используется около десятка функций, которых в PHP7 уже нет. Плюс в PHP7 уже нет mysql, только mysqli. Плюс изменился синтаксис описания конструктора в классах (относительно PHP4, откуда родом код ShopCMS). Плюс...

Ни хрена там нет сложного. Когда мне было интересно - я сделал сервер (виртуалку) с PHP7 и скопировал туда тестовый сайт. Решение всех (вроде бы) проблем заняло несколько часов, но меньше одного рабочего дня. В логи же все пишется - в чем проблема и где искать.

PPS. (на следующий день) Хм... Не посмотрел вчера, что за тема. Я же в начале темы уже все это расписал. В чем проблема-то со смарти?
1. скачать со smarty.net
2. перенести настройки и функцию hassign из старого smarty.class.php в новый.
3. переименовать новый smarty.class.php чтобы он начинался с маленькой буквы (в архиве он с большой).
4. перенести плагин function.count.php (скопировать файл из старого смарти в новый).
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#14 antaNT

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

  • Download User
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 26 августа 2018 - 01:25

Спасибо, я видимо через чур заморочился фразой
"3. Скачать со smarty.net последнюю версию smarty 2.6.* (сейчас это 2.6.31), исправленную под PHP7 и заменить ею старую."

#15 badisoft

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

  • Assistent vsupport.ru
  • PipPipPip
  • 5 071 сообщений
Репутация: 783
Мастер

Отправлено 27 августа 2018 - 20:53

Т.е. теперь все работает? Ну и алилуйя :).
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#16 antaNT

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

  • Download User
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 31 августа 2018 - 10:01

нет, конечно, пока только на 5.6 переделал на utf-8, выскочила такая проблема - пустая строка перед DOCTYPE - все файлы без бом - во всех шаблонах первый символ<!DOCTYPE>, до переконвертации из 1251 ничего такого не было


:P
разобрался, в класах смарти преводы строки стояли после ?>

#17 antaNT

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

  • Download User
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 31 августа 2018 - 11:40

Просмотр сообщенияantaNT (31 августа 2018 - 10:01) писал:

нет, конечно, пока только на 5.6 переделал на utf-8, выскочила такая проблема - пустая строка перед DOCTYPE - все файлы без бом - во всех шаблонах первый символ<!DOCTYPE>, до переконвертации из 1251 ничего такого не было

нет, конечно, пока только на 5.6 переделал на utf-8, выскочила такая проблема - пустая строка перед DOCTYPE - все файлы без бом - во всех шаблонах первый символ<!DOCTYPE>, до переконвертации из 1251 ничего такого не было

разобрался в классах смарти переводы строки стояли после ?>

:D