Какие изменения мне необходимы, чтобы Magento работал с PHP 5.3?

Мне нужно обновить свой сервер до PHP 5.3, но установить Magento, и я знаю, что Magento не играет хорошо с PHP 5.3.

Я думаю, что изменения не будут слишком обширными (из того, что я прочитал). Но я решил, что открою его для толпы SO.

Кто-нибудь сделал это успешно? Если да, вы взяли хорошие заметки?

Похоже, что они все еще находятся в процессе его совместимости:

http://www.magentocommerce.com/boards/viewthread/54158/

Если бы я был вами, я бы дождался официального релиза, прежде чем пытаться перейти на PHP5.3

Чтобы запустить Magento 1.3.x на PHP 5.3, вам необходимо заменить следующую функцию из соответствующих файлов:

1> index.php

error_reporting(E_ALL | E_STRICT); 

в

  error_reporting(E_ALL & E_STRICT & ~E_DEPRECATED); 

2> lib / Varien / Object.php

 __toString 

в

  __invoke 

3> lib / Varien / Pear.php

 error_reporting(E_ALL & ~E_NOTICE); 

в

 error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); 

4> загрузчик / Maged / Pear.php

 error_reporting(E_ALL & ~E_NOTICE); 

в

 error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); 

5> app \ code \ core \ Mage \ Catalog \ Model \ Layer \ Filter \ Price.php

 __toString 

в

 __invoke 

6> app \ code \ core \ Mage \ Core \ Controller \ Request \ Http.php

 split 

в

 explode 

7> app \ code \ core \ Mage \ Catalog \ Model \ Category \ Attribute \ Backend \ Sortby.php

 split 

в

 explode 

8> app \ code \ core \ Mage \ Admin \ Model \ User.php

 split 

в

 explode 

Для пользователей терминалов, которые просто хотят применить патч, я бы рекомендовал использовать следующую статью: http://goivvy.com/blog/magento1.3fix/

Вы можете получить больше информации из следующего блога Magento:
http://www.blog.magepsycho.com/how-to-run-magento-1-3-x-on-php-5-3/

Надеюсь это поможет.

2 строки кода, но тогда это не безопасно для обновления …. производственный сервер никогда не должен запускать последнюю версию в любом случае, я бы никогда не обновлялся на производственном сервере … бета-тестирование или тестирование. __toString -> __invoke и split -> explode

Ну, если вы все-таки решите запустить Magento с PHP 5.3, вот как это сделать (протестировано с версией 1.3.2.3):

1: в index.php, вокруг строки 35, замените

 error_reporting(E_ALL | E_STRICT); 

с

 error_reporting((E_ALL | E_STRICT) & !E_DEPRECATED) 

(причина: Magento часто использует функцию split, которая устарела в PHP 5.3)

2: в /lib/Varien/Object.php, строка 484 изменяется

 public function ___toString(array $arrAttributes = array(), $valueSeparator=',') 

в

 public function __invoke(array $arrAttributes = array(), $valueSeparator=',') 

(причина: я действительно не знаю, но это работает!)

Re nic28: На установке 1.3.3.0 Magento мне также нужно было сделать __toString для изменения __invoke в приложении / коде / ядре / Маге / Каталоге / Модели / Слой / Фильтр / Price.php, строка 139:

 $key=.=taxReq->__toString(array(), '_'); 

Я нашел длинный список файлов, которые используют функцию split. Его нужно заменить взрывом. Будет выполнено простое изменение имени функции. Этот список добавляет, что MagePsycho опубликовал выше. Папка загрузчика может содержать еще несколько файлов, поиск, который я использовал, находится в первой строке.

 Search "\bspliti?\(" (68 hits in 54 files) E:\magento\shop\app\code\core\Mage\Adminhtml\controllers\System\ConfigController.php (1 hits) Line 155: foreach(split("\n", $e->getMessage()) as $message) { E:\magento\shop\app\code\core\Mage\Adminhtml\Model\Observer.php (1 hits) Line 63: $value = is_array($request->getPost($key)) ? $request->getPost($key) : split(',', $request->getPost($key)); E:\magento\shop\app\code\core\Mage\Adminhtml\Model\System\Config\Backend\Currency\Abstract.php (2 hits) Line 47: return split(',', Mage::getConfig()->getNode('currency/options/allow', $this->getScope(), $this->getScopeId())); Line 59: return split(',', Mage::getStoreConfig('system/currency/installed')); E:\magento\shop\app\code\core\Mage\Adminhtml\Model\System\Config\Backend\Locale.php (1 hits) Line 49: $values = split(',', $this->getValue()); E:\magento\shop\app\code\core\Mage\Bundle\sql\bundle_setup\mysql4-install-0.1.0.php (1 hits) Line 162: $applyTo = split(',', $installer->getAttribute('catalog_product', $field, 'apply_to')); E:\magento\shop\app\code\core\Mage\Catalog\Model\Category.php (1 hits) Line 756: $available = split(',', $available); E:\magento\shop\app\code\core\Mage\Catalog\Model\Convert\Adapter\Product.php (2 hits) Line 561: $websiteCodes = split(',', $importData['websites']); Line 592: $value = split(self::MULTI_DELIMITER, $value); E:\magento\shop\app\code\core\Mage\Catalog\Model\Resource\Eav\Mysql4\Url.php (2 hits) Line 502: $split = split('/', $category->getPath()); Line 710: $product->setCategoryIds(split(',', $product->getCategoryIds())); E:\magento\shop\app\code\core\Mage\Catalog\sql\catalog_setup\mysql4-upgrade-0.7.39-0.7.40.php (1 hits) Line 35: $applyTo = split(',', $installer->getAttribute('catalog_product', $field, 'apply_to')); E:\magento\shop\app\code\core\Mage\CatalogRule\Model\Rule\Condition\Product.php (1 hits) Line 361: $value = split(',', $value); E:\magento\shop\app\code\core\Mage\CatalogRule\sql\catalogrule_setup\mysql4-upgrade-0.7.1-0.7.2.php (1 hits) Line 44: foreach (split(',', $r['store_ids']) as $storeId) { E:\magento\shop\app\code\core\Mage\Customer\Model\Convert\Adapter\Customer.php (1 hits) Line 500: $value = split(self::MULTI_DELIMITER, $value); E:\magento\shop\app\code\core\Mage\Downloadable\Helper\Download.php (2 hits) Line 210: $contentType = split('; ', $this->_urlHeaders['content-type']); Line 225: $contentDisposition = split('; ', $this->_urlHeaders['content-disposition']); E:\magento\shop\app\code\core\Mage\Downloadable\sql\downloadable_setup\mysql4-install-0.1.0.php (1 hits) Line 46: $applyTo = split(',', $installer->getAttribute('catalog_product', $field, 'apply_to')); E:\magento\shop\app\code\core\Mage\Downloadable\sql\downloadable_setup\mysql4-upgrade-0.1.0-0.1.1.php (1 hits) Line 32: $applyTo = split(',', $installer->getAttribute('catalog_product', 'weight', 'apply_to')); E:\magento\shop\app\code\core\Mage\Eav\Model\Convert\Adapter\Entity.php (1 hits) Line 107: $split = split('/', $k); E:\magento\shop\app\code\core\Mage\Sales\Model\Order\Pdf\Abstract.php (1 hits) Line 157: foreach (split("\|", $address) as $str) { E:\magento\shop\lib\PEAR\SOAP\Parser.php (1 hits) Line 381: $this->message[$pos]['arrayOffset'] = split(',', substr($value, 1, strlen($value) - 2)); E:\magento\shop\lib\PEAR\SOAP\Transport\HTTP.php (2 hits) Line 272: $headers = split("\r?\n", $headers); Line 278: list($name, $value) = split(':', $value); E:\magento\shop\lib\Varien\Db\Adapter\Pdo\Mysql.php (1 hits) Line 585: $keyList[$v[1]] = split(',', str_replace($this->getQuoteIdentifierSymbol(), '', $v[2])); E:\magento\shop\lib\Zend\Cache\Frontend\Page.php (1 hits) Line 316: $tmp = split(':', $headerSent); E:\magento\shop\lib\Zend\Gdata\YouTube\VideoEntry.php (1 hits) Line 839: return split('(, *)|,', $keywordsString); E:\magento\shop\lib\Zend\Service\Amazon.php (1 hits) Line 202: $responseGroup = split(',', $options['ResponseGroup']); 

Я бы не стал мешать Magento работать с 5.3, так как изменения, безусловно, будут более сложными, чем предполагает ваш источник. PHP 5.3 поставляется с пространствами имен, и механизм автозагрузки изменится точно. Это означает, что многие вещи будут меняться внутренне. Название длинных классов:

 // Mage_Sales_Model_Order Mage::getModel('sales/order'); 

будет вызываться только как порядок в собственном пространстве имен, а не:

 // maybe something like this Mage::getModel('order'); // or like this $order = new Order(); 

// зависит от того, как команда Magento будет внедрять пространства имен

Я затронул эту ситуацию в своем блоге . На самом деле это объясняет, как решить несовместимость между Magento 1.3.X и PHP 5.3.X. Я надеюсь, что это помогает.