Bug PHP 5.5 - Funzionalità obsoleta: preg_replace ()


16

Dopo aver eseguito l'aggiornamento a PHP 5.5, viene visualizzato il seguente errore quando si aggiunge un sito Web, Store o Store View. Questo bug è ancora presente in Magento 1.9.0.1

Exception message: Deprecated functionality: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in app/code/core/Mage/Core/Helper/Abstract.php on line 238
Trace: #0 [internal function]: mageCoreErrorHandler(8192, 'preg_replace():...', 'app...', 238, Array)
#1 app/code/core/Mage/Core/Helper/Abstract.php(238): preg_replace('# <(?![/a-z]) |...', 'htmlentities('$...', 'New Store Name')
#2 app/code/core/Mage/Adminhtml/controllers/System/StoreController.php(175): Mage_Core_Helper_Abstract->removeTags('New Store Name')
#3 app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_System_StoreController->saveAction()
#4 app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('save')
#5 app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#6 app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#7 app/Mage.php(686): Mage_Core_Model_App->run(Array)
#8 index.php(87): Mage::run('', 'store')
#9 {main}

Questo è il codice che produce l'errore

Il codice è disponibile in Mage_Core_Helper_Abstract

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

Questa è, a mio avviso, la patch più semplice per il metodo:

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi",
        create_function('$matches', 'return htmlentities($matches);'),
        $html
    );
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

Il metodo è utilizzato solo dal Mage_Adminhtml_System_StoreController::storeAction().

Esistono tre posti possibili per risolverlo:

  1. Mage_Core_Helper_Abstract => è lì che si trova il metodo, ma fa schifo perché tocca un file core.
  2. Riscrivi Mage_Core_Helper_Abstract => è una classe astratta, quindi non dovrebbe / non può essere riscritta.
  3. Riscrivi Mage_Adminhtml_Helper_Data e aggiungi il metodo lì. => Penso che questa sia la strada da percorrere.

Che cosa ne pensate?

  1. L'opzione 3 è il modo corretto per risolvere il problema.
  2. Il codice nella mia patch è corretto?

Il problema persiste ancora nella versione 1.9.1 CE e 1.14.1 EE

Risposte:


13

Si hai ragione. Correggi l'helper adminhtml. Questa è la diff per la correzione che uso:

--- app/code/core/Mage/Core/Helper/Abstract.php.orig 2014-09-25 15:32:56.000000000 +0200
+++ app/code/core/Mage/Core/Helper/Abstract.php 2014-09-25 15:34:42.000000000 +0200
@@ -235,7 +235,9 @@
  */
 public function removeTags($html)
 {
-        $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
+        $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi", function($matches) {
+            return htmlentities($matches[0]);
+        }, $html);
         $html =  strip_tags($html);
         return htmlspecialchars_decode($html);
 }

Questo è un test per confermare che il comportamento è lo stesso di php 5.4:

<?php

namespace Vinai\Kopp\Magento\Tests;

class MageAdminhtmlHelperDataTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Mage_Adminhtml_Helper_Data
     */
    private $helper;

    static public function setUpBeforeClass()
    {
        ini_set('display_errors', 1);
        umask(0);
        error_reporting(E_ALL);
        require_once 'app/Mage.php';
        \Mage::setIsDeveloperMode(true);
    }

    public function setUp()
    {
        $this->helper = new \Mage_Adminhtml_Helper_Data();
    }

    /**
     * @covers \Mage_Core_Helper_Abstract::removeTags
     * @dataProvider removeTagsDataProvider
     */
    public function testRemoveTags($inputHtml, $expected)
    {
        $result = $this->helper->removeTags($inputHtml);
        $this->assertEquals($expected, $result);
    }

    public function removeTagsDataProvider()
    {
        return array(
            array('<b>', ''),
            array('<b> >', ' >'),
            array('<b> <', ' <'),
            array('<b/> </', ' '),
            array('< <b/>', '< '),
            array('> <b/>', '> '),
            array('</ <b/>', ''),
            array('x />', 'x />'),
            array('> <', '> <'),
            array('>>', '>>'),
            array('<<', '<<'),
            array('<>', '<>'),
        );
    }
} 

4

Questo problema è stato risolto in Magento EE 1.14.1 e 1.9.1. Ulteriori incompatibilità sono le modifiche pack () / unpack () che influiscono sul backup / rollback e su alcune estensioni durante l'installazione, tutto ciò che tocca i file tar. Presumo che chiunque stia eseguendo Magento in produzione non li stia utilizzando.


Quando verrà rilasciata la patch per le versioni precedenti;)
Ben Lessani - Sonassi,

non so ancora se / quando
Piotr Kaminski,

3

Risposta breve: Magento non è compatibile con PHP 5.5, non aggiornare il server Web a 5.5.

Risposta più lunga: suppongo che Magento corregga questo bug con la prossima versione, quindi farei solo un core hack e spero il meglio. Non so se il codice sia corretto, scusa.


Ciao Fabian, gestiamo tutti i nostri server su PHP 5.5 già da un po 'di tempo. Questo è il primo problema che abbia mai incontrato. Quali altre incompatibilità conosciute esistono o da dove provengono queste informazioni?
RobM84,

1
tbh non ne ho idea. Si può solo controllare il changelog php.net/manual/en/migration54.php e grep per i metodi e le impostazioni ini
Fabian Blechschmidt

1
in realtà questo è l'unico problema di PHP 5.5 in magento CE, non ne abbiamo
riscontrato

2
anche questo è un pessimo consiglio, dato che 5.3 è obsoleto, php 5.4 non ha mai raggiunto uno stato reale stabile poiché la maggior parte delle persone lo usa con APC, 5.5 è attualmente l'unica versione di PHP supportata minima stabile, senza menzionare tutte le correzioni di sicurezza che non sono incluso nelle versioni precedenti di PHP
Flyingmana,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.