Jak rozjet phpBB 3.0 na PHP7?

Zde najdete veškeré články portálu phpBB.cz
Uživatelský avatar
Otakar Pěnkava
Administrátor
Administrátor
Příspěvky: 431
Registrován: sob 25. říj 2008 16:17:14
Kontaktovat uživatele:

Jak rozjet phpBB 3.0 na PHP7?

Příspěvekod Otakar Pěnkava » úte 31. kvě 2016 15:29:09

Stále nedám dopustit na phpBB 3.0, využívám ho jako framework, na kterém si stavím různé ať už menší nebo větší systémy. Bohužel koncem roku skončí podpora pro phpBB 3.0 a nedá se očekávat, že ještě přijde verze, která přinese podporu PHP7.

Proto jsem se rozhodl rozběhnout phpBB 3.0 na PHP7 a dát do kupy seznam změn, které musíte udělat, aby vám fórum běželo správně i pod touto verzí PHP.

Změny se provádí klasickým způsobem (= připojíte se na FTP, najdete soubor, otevřete a daný řádek přepíšete/upravíte). Neříkám, že dané opravy jsou nejlepším řešením, určitě by to šlo napsat lépe, ALE fungují a to je hlavní.

Pojďme tedy na to:
Otevři:
includes/functions_content.php
Najdi: (řádek 78)

Kód: Vybrat vše

$selected = $$sort_ary['key'];
Nahraď:

Kód: Vybrat vše

$selected = ${$sort_ary['key']};
Najdi:

Kód: Vybrat vše

/** * make_clickable function * * Replace magic urls of form http://xxx.xxx., www.xxx. and xxx@xxx.xxx. * Cuts down displayed size of link if over 50 chars, turns absolute links * into relative versions when the server/script path matches the link */ function make_clickable($text, $server_url = false, $class = 'postlink') { if ($server_url === false) { $server_url = generate_board_url(); } static $magic_url_match; static $magic_url_replace; static $static_class; if (!is_array($magic_url_match) || $static_class != $class) { $static_class = $class; $class = ($static_class) ? ' class="' . $static_class . '"' : ''; $local_class = ($static_class) ? ' class="' . $static_class . '-local"' : ''; $magic_url_match = $magic_url_replace = array(); // Be sure to not let the matches cross over. ;) // relative urls for this board $magic_url_match[] = '#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#ie'; $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_LOCAL, '\$1', '\$2', '\$3', '$local_class')"; // matches a xxxx://aaaaa.bbb.cccc. ... $magic_url_match[] = '#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#ie'; $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_FULL, '\$1', '\$2', '', '$class')"; // matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing $magic_url_match[] = '#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#ie'; $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_WWW, '\$1', '\$2', '', '$class')"; // matches an email@domain type address at the start of a line, or after a space or after what might be a BBCode. $magic_url_match[] = '/(^|[\n\t (>])(' . get_preg_expression('email') . ')/ie'; $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_EMAIL, '\$1', '\$2', '', '')"; } return preg_replace($magic_url_match, $magic_url_replace, $text); return preg_replace_callback(); }
Nahraď:

Kód: Vybrat vše

/** * make_clickable function * * Replace magic urls of form http://xxx.xxx., www.xxx. and xxx@xxx.xxx. * Cuts down displayed size of link if over 50 chars, turns absolute links * into relative versions when the server/script path matches the link */ function make_clickable($text, $server_url = false, $class = 'postlink') { if ($server_url === false) { $server_url = generate_board_url(); } static $static_class; static $magic_url_match_args; if (!isset($magic_url_match_args[$server_url]) || $static_class != $class) { $static_class = $class; $class = ($static_class) ? ' class="' . $static_class . '"' : ''; $local_class = ($static_class) ? ' class="' . $static_class . '-local"' : ''; if (!is_array($magic_url_match_args)) { $magic_url_match_args = array(); } // relative urls for this board $magic_url_match_args[$server_url][] = array( '#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#iu', MAGIC_URL_LOCAL, $local_class, ); // matches a xxxx://aaaaa.bbb.cccc. ... $magic_url_match_args[$server_url][] = array( '#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#iu', MAGIC_URL_FULL, $class, ); // matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing $magic_url_match_args[$server_url][] = array( '#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#iu', MAGIC_URL_WWW, $class, ); // matches an email@domain type address at the start of a line, or after a space or after what might be a BBCode. $magic_url_match_args[$server_url][] = array( '/(^|[\n\t (>])(' . get_preg_expression('email') . ')/iu', MAGIC_URL_EMAIL, '', ); } foreach ($magic_url_match_args[$server_url] as $magic_args) { if (preg_match($magic_args[0], $text, $matches)) { $text = preg_replace_callback($magic_args[0], function($matches) use ($magic_args) { $relative_url = isset($matches[3]) ? $matches[3] : ''; return make_clickable_callback($magic_args[1], $matches[1], $matches[2], $relative_url, $magic_args[2]); }, $text); } } return $text; }
Otevři:
includes/bbcode.php
Najdi:

Kód: Vybrat vše

$tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);
Nahraď:

Kód: Vybrat vše

$tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) { return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1]))); }, $tpl);
Najdi:

Kód: Vybrat vše

// we need to turn the entities back into their original form to allow the // search patterns to work properly if (!$undid_bbcode_specialchars) { $message = str_replace(array(':', '.'), array(':', '.'), $message); $undid_bbcode_specialchars = true; } $message = preg_replace($preg['search'], $preg['replace'], $message); $preg = array('search' => array(), 'replace' => array());
Nahraď:

Kód: Vybrat vše

// we need to turn the entities back into their original form to allow the // search patterns to work properly if (!$undid_bbcode_specialchars) { $message = str_replace(array(':', '.'), array(':', '.'), $message); $undid_bbcode_specialchars = true; } foreach ($preg['search'] as $key => $search) { if (is_callable($preg['replace'][$key])) { $message = preg_replace_callback($search, $preg['replace'][$key], $message); } else { $message = preg_replace($search, $preg['replace'][$key], $message); } } $preg = array('search' => array(), 'replace' => array());
Najdi:

Kód: Vybrat vše

'preg' => array( '#\[quote(?:="(.*?)")?:$uid\]((?!\[quote(?:=".*?")?:$uid\]).)?#ise' => "\$this->bbcode_second_pass_quote('\$1', '\$2')" )
Nahraď:

Kód: Vybrat vše

'preg' => array( '#\[quote(?:="(.*?)")?:$uid\]((?!\[quote(?:=".*?")?:$uid\]).)?#is' => function ($match) { return $this->bbcode_second_pass_quote($match[1], $match[2]); }, )
Najdi:

Kód: Vybrat vše

case 8: $this->bbcode_cache[$bbcode_id] = array( 'preg' => array( '#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#ise' => "\$this->bbcode_second_pass_code('\$1', '\$2')", ) ); break;
Nahraď:

Kód: Vybrat vše

case 8: $this->bbcode_cache[$bbcode_id] = array( 'preg' => array( '#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#is' => function ($match) { return $this->bbcode_second_pass_code($match[1], $match[2]); }, ) ); break;
Najdi:

Kód: Vybrat vše

'preg' => array( '#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#' => "\$1", '#(\[list=([^\[]+):$uid\])[\n]{1}#' => "\$1", '#\[list=([^\[]+):$uid\]#e' => "\$this->bbcode_list('\$1')", ),
Nahraď:

Kód: Vybrat vše

'preg' => array( '#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#' => "\$1", '#(\[list=([^\[]+):$uid\])[\n]{1}#' => "\$1", '#\[list=([^\[]+):$uid\]#' => function ($match) { return $this->bbcode_list($match[1]); }, ),
Najdi:

Kód: Vybrat vše

// Replace {L_*} lang strings $bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);
Nahraď:

Kód: Vybrat vše

// Replace {L_*} lang strings $bbcode_tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) { return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1]))); }, $bbcode_tpl);
Otevři:
includes/ucp/ucp_register.php

Najdi:

Kód: Vybrat vše

$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
Nahraď:

Kód: Vybrat vše

$error = array_map(array($user, 'lang'), $error);
Otevři:
includes/captcha/plugins/phpbb_captcha_nogd_plugin.php
Najdi:

Kód: Vybrat vše

$instance =& new phpbb_captcha_nogd();
Nahraď:

Kód: Vybrat vše

$instance = new phpbb_captcha_nogd();
Otevři:
includes/captcha/plugins/phpbb_recaptcha_plugin.php
Najdi:

Kód: Vybrat vše

$instance =& new phpbb_recaptcha();
Nahraď:

Kód: Vybrat vše

$instance = new phpbb_recaptcha();
Otevři:
includes/captcha/plugins/phpbb_captcha_qa_plugin.php
Najdi:

Kód: Vybrat vše

$instance =& new phpbb_captcha_qa();
Nahraď:

Kód: Vybrat vše

$instance = new phpbb_captcha_qa();
Otevři:
includes/message_parser.php
Najdi:

Kód: Vybrat vše

// The pattern gets compiled and cached by the PCRE extension, // it should not demand recompilation if (preg_match($regexp, $this->message)) { $this->message = preg_replace($regexp, $replacement, $this->message); $bitfield->set($bbcode_data['bbcode_id']); }
Nahraď:

Kód: Vybrat vše

// The pattern gets compiled and cached by the PCRE extension, // it should not demand recompilation if (preg_match($regexp, $this->message)) { if (is_callable($replacement)) { $this->message = preg_replace_callback($regexp, $replacement, $this->message); } else { $this->message = preg_replace($regexp, $replacement, $this->message); } $bitfield->set($bbcode_data['bbcode_id']); }
Najdi:

Kód: Vybrat vše

// This array holds all bbcode data. BBCodes will be processed in this // order, so it is important to keep -code- in first position and // -quote- in second position. // To parse multiline URL we enable dotall option setting only for URL text // but not for link itself, thus [url][/url] is not affected. $this->bbcodes = array( 'code' => array('bbcode_id' => 8, 'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#ise' => "\$this->bbcode_code('\$1', '\$2')")), 'quote' => array('bbcode_id' => 0, 'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#ise' => "\$this->bbcode_quote('\$0')")), 'attachment' => array('bbcode_id' => 12, 'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#ise' => "\$this->bbcode_attachment('\$1', '\$2')")), 'b' => array('bbcode_id' => 1, 'regexp' => array('#\[b\](.*?)\[/b\]#ise' => "\$this->bbcode_strong('\$1')")), 'i' => array('bbcode_id' => 2, 'regexp' => array('#\[i\](.*?)\[/i\]#ise' => "\$this->bbcode_italic('\$1')")), 'url' => array('bbcode_id' => 3, 'regexp' => array('#\[url(=(.*))?\](.*)\[/url\]#iUe' => "\$this->validate_url('\$2', '\$3')")), 'img' => array('bbcode_id' => 4, 'regexp' => array('#\[img\](.*)\[/img\]#iUe' => "\$this->bbcode_img('\$1')")), 'size' => array('bbcode_id' => 5, 'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#ise' => "\$this->bbcode_size('\$1', '\$2')")), 'color' => array('bbcode_id' => 6, 'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!ise' => "\$this->bbcode_color('\$1', '\$2')")), 'u' => array('bbcode_id' => 7, 'regexp' => array('#\[u\](.*?)\[/u\]#ise' => "\$this->bbcode_underline('\$1')")), 'list' => array('bbcode_id' => 9, 'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#ise' => "\$this->bbcode_parse_list('\$0')")), 'email' => array('bbcode_id' => 10, 'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#ise' => "\$this->validate_email('\$1', '\$2')")), 'flash' => array('bbcode_id' => 11, 'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#ie' => "\$this->bbcode_flash('\$1', '\$2', '\$3')")) );
Nahraď:

Kód: Vybrat vše

$bbcode_class = $this; // This array holds all bbcode data. BBCodes will be processed in this // order, so it is important to keep -code- in first position and // -quote- in second position. $this->bbcodes = array( 'code' => array('bbcode_id' => 8, 'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_code($match[1], $match[2]); } )), 'quote' => array('bbcode_id' => 0, 'regexp' => array('#\[quote(?:="(.*?)")?\](.+)\[/quote\]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_quote($match[0]); } )), 'attachment' => array('bbcode_id' => 12, 'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_attachment($match[1], $match[2]); } )), 'b' => array('bbcode_id' => 1, 'regexp' => array('#\[b\](.*?)\[/b\]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_strong($match[1]); } )), 'i' => array('bbcode_id' => 2, 'regexp' => array('#\[i\](.*?)\[/i\]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_italic($match[1]); } )), 'url' => array('bbcode_id' => 3, 'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiU' => function ($match) use($bbcode_class) { return $bbcode_class->validate_url($match[2], ($match[3]) ? $match[3] : $match[4]); } )), 'img' => array('bbcode_id' => 4, 'regexp' => array('#\[img\](.*)\[/img\]#uiU' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_img($match[1]); } )), 'size' => array('bbcode_id' => 5, 'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_size($match[1], $match[2]); } )), 'color' => array('bbcode_id' => 6, 'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_color($match[1], $match[2]); } )), 'u' => array('bbcode_id' => 7, 'regexp' => array('#\[u\](.*?)\[/u\]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_underline($match[1]); } )), 'list' => array('bbcode_id' => 9, 'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_parse_list($match[0]); } )), 'email' => array('bbcode_id' => 10, 'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uis' => function ($match) use($bbcode_class) { return $bbcode_class->validate_email($match[1], $match[2]); } )), 'flash' => array('bbcode_id' => 11, 'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#ui' => function ($match) use($bbcode_class) { return $bbcode_class->bbcode_flash($match[1], $match[2], $match[3]); } )) );
Najdi:

Kód: Vybrat vše

// To let the parser not catch tokens within quote_username quotes we encode them before we start this... $in = preg_replace('#quote="(.*?)"\]#ie', "'quote="' . str_replace(array('[', ']', '\\\"'), array('[', ']', '\"'), '\$1') . '"]'", $in);
Nahraď:

Kód: Vybrat vše

// To let the parser not catch tokens within quote_username quotes we encode them before we start this... $in = preg_replace_callback('#quote="(.*?)"\]#i', function ($match) { return 'quote="' . str_replace(array('[', ']', '\\\"'), array('[', ']', '\"'), $match[1]) . '"]'; }, $in);
Upozornění:
Pokud máte v config.php:

Kód: Vybrat vše

$dbms = 'mysql';
Změňte na:

Kód: Vybrat vše

$dbms = 'mysqli';
Starám se o projekt phpBB.cz od doby, kdy jsem jej zachránil před zaniknutím. Pomůžete mi a dostaneme jej zase nahoru?
Přes soukromé zprávy neposkytuji podporu.

smiesek
V.I.P.
V.I.P.
Příspěvky: 3009
Registrován: stř 22. úno 2006 1:00:00
Bydliště: Praha
Kontaktovat uživatele:

Re: Jak rozjet phpBB 3.0 na PHP7?

Příspěvekod smiesek » úte 31. kvě 2016 18:58:19

zdravím, trošku mi unikají podstaty, jak souvisí PHP7 s phpBB 3.0? Resp. proč je případně vhodné udělat tuto změnu? Týká se pouze nové instalace a nebo i současných for, které jsou na phpBB 3.0?

Děkuju za vysvětlení a věnování mi času.

Uživatelský avatar
Otakar Pěnkava
Administrátor
Administrátor
Příspěvky: 431
Registrován: sob 25. říj 2008 16:17:14
Kontaktovat uživatele:

Re: Jak rozjet phpBB 3.0 na PHP7?

Příspěvekod Otakar Pěnkava » úte 31. kvě 2016 20:36:29

Ahoj,
mám projekty, které běží na phpBB 3.0 a je nemožné je aktualizovat na phpBB 3.1 a novější z toho důvodu, že jsou silně modifikované a nové phpBB 3.1 by bylo pro ně nesmyslnou překážkou. Bohužel phpBB 3.0 (ani 3.1) nejedou na novější verzi PHP, vyskakují chyby atp. Tento postup právě opraví dané chyby, takže kdo bude chtít aktualizovat na novější PHP, tak může i se starším phpBB.
Starám se o projekt phpBB.cz od doby, kdy jsem jej zachránil před zaniknutím. Pomůžete mi a dostaneme jej zase nahoru?
Přes soukromé zprávy neposkytuji podporu.

Uživatelský avatar
kksmirice
Junior tým
Junior tým
Příspěvky: 1639
Registrován: pát 17. úno 2012 21:39:58
Kontaktovat uživatele:

Re: Jak rozjet phpBB 3.0 na PHP7?

Příspěvekod kksmirice » úte 31. kvě 2016 20:38:30

Stačí si trochu projít změněné funkce a přijdete na to, že z php7 byly odstraněny, buď celé nebo jen některé části nejsou podporovány.

A odpověď na další dotaz je snad již jasný - týká se všech fór verze 3.0.
Klidně mi Vykejte, mohl bych být Vašim dědou...
1. Murphyho zákon: Na počátku nebylo nic. I to se pokazilo!

stránky: KK Zálabák Smiřice, test stránky pro všechny

[url=mailto://prolamy@email.cz?subject=phpBB%20pomoc]kontakt[/url] v případě pomoci - instalace systémů, založení databáze a tabulek, FTP přístup

Uživatelský avatar
Otakar Pěnkava
Administrátor
Administrátor
Příspěvky: 431
Registrován: sob 25. říj 2008 16:17:14
Kontaktovat uživatele:

Re: Jak rozjet phpBB 3.0 na PHP7?

Příspěvekod Otakar Pěnkava » pát 14. říj 2016 13:33:43

Při přechodu WebDeal.cz z PHP 5.5 na 7.0 jsem přišel na další možné chyby a tak jsem do návodu přidal na konec instrukce pro úpravu souboru messenger_parser.php a config.php
Starám se o projekt phpBB.cz od doby, kdy jsem jej zachránil před zaniknutím. Pomůžete mi a dostaneme jej zase nahoru?
Přes soukromé zprávy neposkytuji podporu.


Zpět na „Články“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 4 hosti