PHP 7 a záchrana aplikací v Nette 2.0

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ludek
Člen | 83
+
0
-

Dobrý den,

zavolali mě k serveru, kde byl proveden upgrade na Ubuntu 16.04.1, což znamená PHP 7.0.8.

Bohužel se zjistilo, že na tom běží několik aplikací postavených na Nette 2.0.12, které přestaly fungovat: bílá obrazovka, nic se nezaloguje, ani se nevytvoří žádná část smazané cache. Po překopírování na lokál s PHP 5.4 fungují. Cesta zpět není, jinam se to přesunout nedá, původní autor aplikací není k dosažení. Jedná se o samé evidence něčeho: práce s mysql, formuláře, max. odesílání emailů.

Mám prosím nějakou možnost, jak to rozběhnout?

norbe
Backer | 405
+
+7
-

Máme několik starších projektů (nette 2.0.3), které jsme na php 7 rozjeli s minimem úprav.

Drobné shrnutí změn provedených v nette:

Nette\Diagnostics\BlueScreen::render

  • odstraněn typehint \Exception u parametru

Nette\Diagnostics\Debugger::_exceptionHandler

  • odstraněn typehint \Exception u parametru
  • v místě kde je ošetřena chyba při logování přidán další blok catch (\Throwable $e)

Nette\loader.php

  • smazáno volání set_magic_quotes_runtime, iconv_set_encoding a mb_internal_encoding

Driver pro mysql musí být mysqli (mysql zrušeno)

Pokud používáš dibi tak ještě smazat volání set_magic_quotes_runtime v něm.

ludek
Člen | 83
+
0
-

norbe napsal(a):
Nette\loader.php

  • smazáno volání set_magic_quotes_runtime

Moc díky. To co zabraňuje spuštění je právě @set_magic_quotes_runtime(FALSE); v libs/Nette/loader.php.
Po zakomentování se aplikace spustí a začnou se zobrazovat chyby Laděnky.

Výsledek (edit):

Všechny aplikace se podařilo ihned zprovoznit provedením jen té jediné změny v loader.php.

Všechno funguje včetně spojení na databázi (všude se používá jen Nette\Database) i odesílání emailů.

Výjimkou byl jeden projekt, kde bylo nutno přepsat redirecty, pokud obsahovaly nějaké parametry.

Z původního
$this->redirect('default','1','2');
což do prvního parametru místo první hodnoty předalo název volané metody (‚default‘).
bylo nutno přepsat na:
 $this->redirect('default', array('par1'=>'1', 'par2'=>'2'));

Editoval ludek (12. 8. 2016 14:57)