ExBB Community » Файловый ExBB » Решение проблем » Адаптация ядра форума для PHP 5.4

Страниц (3): [1] 2 3 »
 

1. yura3d_2 - 1 июля 2013 — 08:38 - перейти к сообщению
Тут на форуме за последнее время прочитал несколько мнений, в которых люди высказывают свои опасения по поводу новых версий PHP и возможной неработоспособности ExBB на них. Хочу несколько развеять эти опасения и заявить, что при проектировании ядра ExBB FM 1.0 использовались максимально унифицированные между версиями языка средства и конструкции PHP, таким образом, ядро форума способно работать как на устаревшем PHP 4, так и с новыми версиями PHP 5.4 и грядущем PHP 6 (с минимальными изменениями). Если Ваш хостер уже перешёл на текущую стабильную ветку PHP 5.4.x, то ExBB с миниальными правками в ядре будет прекрасно работать и с ней.

На текущий момент единственная несовместимость ядра ExBB с PHP 5.4 выявлена в том, что в новой версии PHP запрещено явно использовать дескрипторы ресурсов (в ExBB это открытые файлы текстовой базы данных форумы) в качестве индекса массивов (общий массив дескрипторов открытых файлов применяется для противодействия блокировке и обнулению файлов в случае ошибочного завершения работы).

Для решения проблемы совместимости откройте файл include/fm.class.php, находим строку:
CODE:
$this->_FilePointers[$fp] = $fp;

и замените её строкой:
CODE:
$this->_FilePointers[(int) $fp] = $fp;

В этом же файле найдите строку:
CODE:
unset($arr,$this->_FilePointers[$fp]);

и замените её строкой:
CODE:
unset($arr,$this->_FilePointers[(int) $fp]);

В этом же файле найдите строку:
CODE:
unset($this->_FilePointers[$fp]);

и замените её строкой:
CODE:
unset($this->_FilePointers[(int) $fp]);

На этом всё!
2. Yamaliya - 1 июля 2013 — 16:01 - перейти к сообщению
yura3d_2, изменения можно сделать заранее? Не дожидаясь перехода хостера на новые версии? Другими словами: будет-ли изменённый код работоспособен на старых версиях?
3. yura3d_2 - 1 июля 2013 — 16:04 - перейти к сообщению
wasp пишет:
yura3d_2, изменения можно сделать заранее? Не дожидаясь перехода хостера на новые версии? Другими словами: будет-ли изменённый код работоспособен на старых версиях?

Да. Если хостер обновит версию PHP до 5.4 раньше, чем Вы сделаете эти изменения, форум будет выдавать предупреждения:
CODE:
Strict Standards: Resource ID#<NN> used as offset, casting to integer
4. BON - 1 июля 2013 — 16:40 - перейти к сообщению
с php 5.4 есть проблемы и с модом хранения статистики. Функции SQLte меняются. Нельзя пока ставить 5.4
5. alexx - 1 июля 2013 — 16:50 - перейти к сообщению
yura3d_2
Спасибо за предупреждение и решение, до конвертации хочется сохранить рабочим все, вот заметил:

Цитата:
В этом же файле найдите строку:

CODE:
unset($this->_FilePointers[$fp]);


и замените её строкой:

CODE:
unset($this->_FilePointers[(int) $fp]);[/quote]



Первая строка встречается вот здесь еще ( 434 строка в файле), оставить или заменить?

CODE:
if ($mode != LOCK_SH) unset($this->_FilePointers[$fp]);
6. BON - 1 июля 2013 — 19:59 - перейти к сообщению
yura3d_2, кстати, ещё был тест на php 5.4, не знаю поправили щас в нем это или это от двига зависит, но форум тупо не понимал кориллицу. Если в сообщении была кирилица то не добавлялись посты, если латиницей писать то нормал. Кому охото заморочиться, проверьте
7. yura3d_2 - 1 июля 2013 — 20:19 - перейти к сообщению
alexx пишет:
Первая строка встречается вот здесь еще ( 434 строка в файле), оставить или заменить?

Эта строка у Вас должна быть в закомментированном, и соответственно, неиспользуемом фрагменте кода. Поэтому её можно оставить как есть.

BON пишет:
с php 5.4 есть проблемы и с модом хранения статистики. Функции SQLte меняются. Нельзя пока ставить 5.4

Я пока говорю только про ядро, модов не касаюсь.

BON пишет:
yura3d_2, кстати, ещё был тест на php 5.4, не знаю поправили щас в нем это или это от двига зависит, но форум тупо не понимал кориллицу. Если в сообщении была кирилица то не добавлялись посты, если латиницей писать то нормал. Кому охото заморочиться, проверьте

У меня работает
8. CAB - 23 июля 2013 — 21:54 - перейти к сообщению
Пытаюсь потестировать данную доработку и вот что получается, именно на версии 5.4 на некоторых страницах админки вылетает ошибка 500 (на более старших версиях всё работает).
Вычислил источник - это строка
CODE:
if ( $key == 'gzip_level' ) validate_gzip_level( &$variable );
в файле setvariables.php, а именно символ & перед переменной. Данная строка из мода печать эффективности GZip сжатия и возможность изменения степени сжатия. Её у многих нет, но полазив по скрипту, увидел большое количество мест, где эта конструкция используется.
К сожалению не могу найти информацию зачем нужен этот символ перед переменной. Кто знает отпишитесь. А там разберёмся, что с ним делать.
9. yura3d_2 - 23 июля 2013 — 22:46 - перейти к сообщению
CAB
Этот символ в вызовах функций - по сути синтаксическая ошибка. Просто старые версии PHP при встрече такового выводили либо нотисы, либо вообще никак на него не реагировали. Начиная с версии 5.4 синтаксический анализатор стал более строг ко многим мелочам и устаревшим конструкциям. Конечно, к 500-й ошибке это не должно приводить. Возможно, у Вас в файле php.ini просто отключён вывод ошибок на экран. Смотрите директиву display_errors, часто из-за отключённого вывода ошибок (а во многих репозиториях, в том числе Debian, он по-умолчанию как раз-таки отключён) вместо внятного сообщения об ошибках юзеры получают либо 500-ю ошибку, либо пустую страницу, что и вводит их в ступор.

Ну а что с самим символом делать, думаю понятно - удалить.
(Добавление)
Кстати, строки, вызывающие проблему, относятся к моду Печать эффективности сжатия Gzip. В самом ядре ExBB подобной проблемы нет
10. 1Bot - 24 июля 2013 — 08:36 - перейти к сообщению
Кстати функция unserialize, которая используется для декодирования файлов форума намного быстрее работает в php 5.4.9 в сравнении с 5.3.8. Особенно заметно при больших объемах декодируемого, да и памяти меньше используется новым php 5.4.9.
Так что есть смысл по возможности перейти на новую версию.
11. CAB - 24 июля 2013 — 12:41 - перейти к сообщению
yura3d_2 пишет:
Ну а что с самим символом делать, думаю понятно - удалить.
Спасибо за разъяснения.
yura3d_2 пишет:
В самом ядре ExBB подобной проблемы нет
А что тогда делать с этим:
1. В файле forums.php
CODE:
function viewing(&$statviewing, &$statforum) {

2. В файле include\fm.class.php
CODE:
function _Read2Write(&$fp,$filename,$newfile = TRUE) {
CODE:
function _Write(&$fp,$arr) {
CODE:
//function _Flock(&$fp,$filename,$mode = LOCK_SH) {

3. В файле include\JsHttpRequest\JsHttpRequest.php
CODE:
ob_start(array(&$this, "_obHandler"));
CODE:
array_walk_recursive($result, array(&$this, '_toUtf8_callback'), $this->SCRIPT_ENCODING);
CODE:
function _toUtf8_callback(&$v, $k, $fromEnc)
CODE:
$data = preg_replace_callback('/%u([0-9A-F]{1,4})/si', array(&$this, '_ucs2EntitiesDecodeCallback'), $data);

4. В файле include\lib.php
CODE:
function Print_Paginator($total,$get,$per,$links,&$first,$dots = FALSE) {
CODE:
function validate_gzip_level( &$gzip_level )
Последнее от названного ранее мода.

5. В файле include\vars.class.php
CODE:
function Read_Vars(&$return,$array) {
CODE:
return preg_replace("#&amp;(\#[0-9]+;)#", "&$1", htmlspecialchars($var,ENT_QUOTES));
CODE:
function _Boolean(&$array,$key) {

6. В файле index.php
CODE:
function viewing(&$viewing) {
CODE:
function today(&$todayvisit) {

7. В файле modules\mailer\_cron.php
CODE:
function _Read2Write(&$fp, $file) {
CODE:
function _Write(&$fp, $data) {

8. В файле modules\mailer\Mailer.class.php
CODE:
$sent = &$config['sent'];
CODE:
$sent = &$config['through'];

9. В файле modules\threadstop\frontindex.php
CODE:
function sort_array($array,$key,&$return_array){
CODE:
function _sort(&$array, $key, $state) {

10. В файле postings.php
CODE:
function UpdateAutorsInfo(&$autors) {
CODE:
function UpdateOldList(&$topic,&$list) {
CODE:
function UpdateOldTopicFile(&$topic,&$postkey,$mode) {
CODE:
function UpdateAttaches(&$newtopic,&$attaches) {

11. В файле search\search.php
CODE:
function get_query(&$wholeword,&$querymode,&$query_arr) {
CODE:
function get_results($inforum,$wholeword,$querymode,$query_arr,&$allres) {
CODE:
function boolean($inforum,&$query_arr,&$querymode,&$allres) {

12. В файле topic.php
CODE:
function viewing(&$viewing) {

yura3d_2 пишет:
Этот символ в вызовах функций - по сути синтаксическая ошибка.
Я сначала так и подумал, но увидев количество таких "ошибок" засомневался.
12. yura3d_2 - 24 июля 2013 — 14:36 - перейти к сообщению
CAB пишет:
Я сначала так и подумал, но увидев количество таких "ошибок" засомневался.

Судя по Вашему сообщению, Вы никогда не слышали о механизме ссылок (references) в PHP. Поэтому для начала прочтите мануал http://php.net/manual/ru/languag...ences.whatdo.php
В объявлении функций символ & не является ошибкой, он лишь указывает, что аргумент передаётся в функцию по ссылке, а не по значению. Такая передача производится в тех случаях, когда необходимо, чтобы функция могла работать с исходной переменной (объектом), а не с его локальной копией внутри функции (как при передаче по значению). В результате, все изменения, произведённые над ссылкой внутри функции, отражаются на значении исходной переменной за пределами функции (без необходимости использования выражения return, которое, к слову, может возвращать из функции лишь одно значение). Также передача аргументов по ссылке позволяет экономить ОЗУ и процессорное время.

CAB пишет:
CODE:
ob_start(array(&$this, "_obHandler"));

CAB пишет:
CODE:
$sent = &$config['sent'];

Ссылки также могут выступать элементами массива и операндами в выражениях, тут тоже ошибки нет. Итого, ни в одной из приведённых Вами строк нет ошибок.
13. CAB - 24 июля 2013 — 16:29 - перейти к сообщению
yura3d_2 пишет:
Судя по Вашему сообщению, Вы никогда не слышали о механизме ссылок (references) в PHP.
Ещё раз большое спасибо за разъяснение и за ссылку на мануал. Я ж как раз и написал в своём первом посте, что не смог найти информацию по этому вопросу. Поисковики просто не понимали что я хочу ибо я сам не понимал что мне надо. Я правда и сейчас не понимаю, но хотя бы знаю как это называется Радость
Даже прочитав мануал, а также и другую найденную мной теперь информацию я не могу сообразить почему приведённая здесь http://exbb.info/community/topic...16457#1374616457 мной строка не правильная? По виду она вполне похожа на "правильные".

yura3d_2, и ещё вопрос к первому сообщению темы.
В файле search.php есть строка
CODE:
$fm->_FilePointers[$fp] = $fp;
надо ли её изменить на
CODE:
$fm->_FilePointers[(int) $fp] = $fp;
или в данном случае это не надо делать?
14. roma1 - 25 июля 2013 — 14:27 - перейти к сообщению
мой форум перевели на 5.3.24 и побелел экран при включенных модах хранения статистики и поиск сообщений вроде, ну всех что использует sqlite. Вынужден был отключить либо моды тогда форум заработал, но это плохо. Тогда удалил файл Php.ini с сервера и включил моды. Форум заработал но ерор лог наполняется слишком быстро, моды работают но файл php.ini мне был нужен вроде, он направлял файлы сессий в папку temp на сервере, куда они теперь валят я не знаю ибо папка пуста с тех пор как удалил ini файл.
Хостер не доволен стуком, говорит что обновляйте двиг под версию php. Ранее до обновления сервера всё работало.

Вот прикрепляю файл php.ini может кто когда то что и поможет, и эрор лог к нему прямо с сервера.
думаю это в тему, если нет то перенесите в нужную тему. с ув.
15. 1Bot - 25 июля 2013 — 14:50 - перейти к сообщению
roma1 пишет:
Вот прикрепляю файл php.ini может кто когда то что и поможет

Навскидку просмотрев php.ini есть одна неувязка - дважды задается путь к библиотеке Zend:
CODE:
zend_extension="/usr/local/IonCube/ioncube_loader_lin_5.2.so"
zend_extension="/usr/local/Zend/lib/Optimizer-3.3.9/php-5.2.x/ZendOptimizer.so"


по файлу error_log чтобы понять необходимо видеть файлы, в которых есть ошибки:
/home/arxevari/public_html/include/fm.class.php
/home/arxevari/public_html/index.php

хотя там только предупреждения и подсказки, но критических ошибок нет.

Яндекс.Метрика   

Powered by ExBB
[Script Execution time: 0.0295]     [ ]