yura3d_2 |
Отправлено: 1 июля 2013 — 08:38
|
Junior Member
Покинул форум
Сообщений всего: 64
Дата рег-ции: Апр. 2013
Репутация: 2
|
Тут на форуме за последнее время прочитал несколько мнений, в которых люди высказывают свои опасения по поводу новых версий 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]);
На этом всё! |
|
|
yura3d_2 |
Отправлено: 1 июля 2013 — 16:04
|
Junior Member
Покинул форум
Сообщений всего: 64
Дата рег-ции: Апр. 2013
Репутация: 2
|
wasp пишет:yura3d_2, изменения можно сделать заранее? Не дожидаясь перехода хостера на новые версии? Другими словами: будет-ли изменённый код работоспособен на старых версиях?
Да. Если хостер обновит версию PHP до 5.4 раньше, чем Вы сделаете эти изменения, форум будет выдавать предупреждения:
CODE:Strict Standards: Resource ID#<NN> used as offset, casting to integer |
|
|
alexx |
Отправлено: 1 июля 2013 — 16:50
|
Advanced Member
Покинул форум
Сообщений всего: 495
Дата рег-ции: Февр. 2010
Откуда: Россия
Репутация: 12
|
yura3d_2
Спасибо за предупреждение и решение, до конвертации хочется сохранить рабочим все, вот заметил:
Цитата:В этом же файле найдите строку:
CODE:unset($this->_FilePointers[$fp]);
и замените её строкой:
CODE:unset($this->_FilePointers[(int) $fp]);[/quote]
Первая строка встречается вот здесь еще ( 434 строка в файле), оставить или заменить?
CODE:if ($mode != LOCK_SH) unset($this->_FilePointers[$fp]); |
|
|
yura3d_2 |
Отправлено: 1 июля 2013 — 20:19
|
Junior Member
Покинул форум
Сообщений всего: 64
Дата рег-ции: Апр. 2013
Репутация: 2
|
alexx пишет:Первая строка встречается вот здесь еще ( 434 строка в файле), оставить или заменить?
Эта строка у Вас должна быть в закомментированном, и соответственно, неиспользуемом фрагменте кода. Поэтому её можно оставить как есть.
BON пишет:с php 5.4 есть проблемы и с модом хранения статистики. Функции SQLte меняются. Нельзя пока ставить 5.4
Я пока говорю только про ядро, модов не касаюсь.
BON пишет:yura3d_2, кстати, ещё был тест на php 5.4, не знаю поправили щас в нем это или это от двига зависит, но форум тупо не понимал кориллицу. Если в сообщении была кирилица то не добавлялись посты, если латиницей писать то нормал. Кому охото заморочиться, проверьте
У меня работает |
|
|
yura3d_2 |
Отправлено: 23 июля 2013 — 22:46
|
Junior Member
Покинул форум
Сообщений всего: 64
Дата рег-ции: Апр. 2013
Репутация: 2
|
CAB
Этот символ в вызовах функций - по сути синтаксическая ошибка. Просто старые версии PHP при встрече такового выводили либо нотисы, либо вообще никак на него не реагировали. Начиная с версии 5.4 синтаксический анализатор стал более строг ко многим мелочам и устаревшим конструкциям. Конечно, к 500-й ошибке это не должно приводить. Возможно, у Вас в файле php.ini просто отключён вывод ошибок на экран. Смотрите директиву display_errors, часто из-за отключённого вывода ошибок (а во многих репозиториях, в том числе Debian, он по-умолчанию как раз-таки отключён) вместо внятного сообщения об ошибках юзеры получают либо 500-ю ошибку, либо пустую страницу, что и вводит их в ступор.
Ну а что с самим символом делать, думаю понятно - удалить.
(Добавление)
Кстати, строки, вызывающие проблему, относятся к моду Печать эффективности сжатия Gzip. В самом ядре ExBB подобной проблемы нет(Отредактировано автором: 23 июля 2013 — 22:47) |
|
|
CAB |
Отправлено: 24 июля 2013 — 12:41
|
Super Member
Покинул форум
Сообщений всего: 629
Дата рег-ции: Февр. 2011
Откуда: Москва
Репутация: 30
|
yura3d_2 пишет:Ну а что с самим символом делать, думаю понятно - удалить. Спасибо за разъяснения.
yura3d_2 пишет:В самом ядре ExBB подобной проблемы нет А что тогда делать с этим:
1. В файле forums.phpCODE:function viewing(&$statviewing, &$statforum) {
2. В файле include\fm.class.phpCODE: function _Read2Write(&$fp,$filename,$newfile = TRUE) {
CODE: function _Write(&$fp,$arr) {
CODE: //function _Flock(&$fp,$filename,$mode = LOCK_SH) {
3. В файле include\JsHttpRequest\JsHttpRequest.phpCODE: 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.phpCODE:function Print_Paginator($total,$get,$per,$links,&$first,$dots = FALSE) {
CODE:function validate_gzip_level( &$gzip_level )
Последнее от названного ранее мода.
5. В файле include\vars.class.phpCODE: function Read_Vars(&$return,$array) {
CODE: return preg_replace("#&(\#[0-9]+;)#", "&$1", htmlspecialchars($var,ENT_QUOTES));
CODE: function _Boolean(&$array,$key) {
6. В файле index.phpCODE:function viewing(&$viewing) {
CODE:function today(&$todayvisit) {
7. В файле modules\mailer\_cron.phpCODE: function _Read2Write(&$fp, $file) {
CODE: function _Write(&$fp, $data) {
8. В файле modules\mailer\Mailer.class.phpCODE: $sent = &$config['sent'];
CODE: $sent = &$config['through'];
9. В файле modules\threadstop\frontindex.phpCODE:function sort_array($array,$key,&$return_array){
CODE:function _sort(&$array, $key, $state) {
10. В файле postings.phpCODE:function UpdateAutorsInfo(&$autors) {
CODE:function UpdateOldList(&$topic,&$list) {
CODE:function UpdateOldTopicFile(&$topic,&$postkey,$mode) {
CODE:function UpdateAttaches(&$newtopic,&$attaches) {
11. В файле search\search.phpCODE: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.phpCODE:function viewing(&$viewing) {
yura3d_2 пишет:Этот символ в вызовах функций - по сути синтаксическая ошибка. Я сначала так и подумал, но увидев количество таких "ошибок" засомневался. |
|
|
yura3d_2 |
Отправлено: 24 июля 2013 — 14:36
|
Junior Member
Покинул форум
Сообщений всего: 64
Дата рег-ции: Апр. 2013
Репутация: 2
|
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'];
Ссылки также могут выступать элементами массива и операндами в выражениях, тут тоже ошибки нет. Итого, ни в одной из приведённых Вами строк нет ошибок. |
|
|
CAB |
Отправлено: 24 июля 2013 — 16:29
|
Super Member
Покинул форум
Сообщений всего: 629
Дата рег-ции: Февр. 2011
Откуда: Москва
Репутация: 30
|
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;
или в данном случае это не надо делать? |
|
|
|