PHP 5.5 बग - संक्षिप्त कार्यक्षमता: preg_replace ()


16

PHP 5.5 में अपग्रेड होने के बाद, वेबसाइट, स्टोर या स्टोर व्यू जोड़ते समय हमें निम्न त्रुटि मिलती है। यह बग अभी भी 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}

यह वह कोड है जो त्रुटि उत्पन्न करता है

कोड में पाया जा सकता है 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);
}

यह मेरी राय में, विधि के लिए सबसे आसान पैच है:

/**
 * 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);
}

विधि केवल द्वारा उपयोग किया जाता है Mage_Adminhtml_System_StoreController::storeAction()

इसे ठीक करने के लिए तीन संभावित स्थान हैं:

  1. Mage_Core_Helper_Abstract => वह जगह जहां विधि स्थित है, लेकिन यह बेकार है क्योंकि यह एक मूल फ़ाइल को छूती है।
  2. पुनर्लेखन Mage_Core_Helper_Abstract => यह एक सार वर्ग है, इसलिए इसे दोबारा नहीं लिखा जाना चाहिए।
  3. Mage_Adminhtml_Helper_Data को फिर से लिखें और वहां विधि जोड़ें। => मुझे लगता है कि यह जाने का रास्ता है।

आप लोग क्या सोचते हैं?

  1. विकल्प 3 # समस्या को ठीक करने का सही तरीका है।
  2. क्या मेरे पैच में कोड सही है?

मुद्दा अभी भी 1.9.1 CE और 1.14.1 EE में मौजूद है

जवाबों:


13

हाँ आप सही है। व्यवस्थापक गेम सहायक को ठीक करें। यह मेरे द्वारा उपयोग किए जाने वाले फिक्स के लिए भिन्न है:

--- 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);
 }

यह व्यवहार की पुष्टि करने के लिए एक परीक्षण है जो 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

यह अब Magento EE 1.14.1 और 1.9.1 में तय किया गया है। अतिरिक्त असंगति पैक है () / अनपैक () परिवर्तन जो बैकअप / रोलबैक को प्रभावित करता है और स्थापना के दौरान कुछ एक्सटेंशन - कुछ भी जो टार फाइलों को छूता है। मुझे लगता है कि जो कोई भी उत्पादन में Magento चला रहा है, वह उन का उपयोग नहीं कर रहा है।


जब पैच पहले संस्करणों के लिए जारी किया जा रहा है;)
बेन लेसानी - सोनासी

अभी तक नहीं पता है कि कब / कब
पियोत्र कमिंसकी

3

संक्षिप्त उत्तर: Magento PHP 5.5 संगत नहीं है, अपने वेबसर्वर को 5.5 में अपडेट न करें।

लंबा जवाब: मैं मान सकता हूं, मैगेंटो ने इस बग को अगले संस्करण के साथ ठीक कर दिया है, इसलिए मैं सिर्फ एक कोर हैक करूंगा और सबसे अच्छी उम्मीद करूंगा। मुझे नहीं पता कि कोड सही है, क्षमा करें।


हाय फैबियन, हम काफी समय से अपने सभी सर्वरों को PHP 5.5 पर चलाते हैं। यह पहली समस्या है जिसका मैंने कभी सामना किया है। अन्य कौन सी ज्ञात विसंगतियाँ मौजूद हैं या यह जानकारी कहाँ से आई है?
RobM84

1
tbh मुझे कोई पता नहीं है। आप सिर्फ तरीकों और आईएनआई सेटिंग्स के लिए changelog php.net/manual/en/migration54.php और grep की जांच कर सकते हैं
Fabian Blechschmidt

1
वास्तव में यह Magento CE में केवल PHP 5.5 समस्या है, हम पिछले आधे साल में इसे चलाने के लिए एक और हिट नहीं किया
फ्लाइंगमैन

2
यह भी एक बहुत बुरी सलाह है, जैसा कि 5.3 पुराना है, php 5.4 ने कभी भी वास्तविक स्थिर स्थिति को हिट नहीं किया है क्योंकि अधिकांश लोग एपीसी के साथ इसका उपयोग करते हैं, 5.5 वर्तमान में केवल न्यूनतम स्थिर समर्थित PHP संस्करण उपलब्ध है, जो सभी सुरक्षा फ़िक्सेस का उल्लेख नहीं करते हैं। पुराने PHP संस्करणों में शामिल
फ्लाइंगमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.