Apakah Magento siap untuk PHP 7?

71

PHP 7 mencapai status beta dan banyak pengujian sedang berlangsung saat ini. Mengingat bahwa Magento terperangkap dalam setahun terakhir dari "hanya berjalan pada PHP 5.3" hingga "sepenuhnya kompatibel dengan PHP 5.6", saya ingin tahu seberapa banyak mereka mempertimbangkan kompatibilitas PHP 7 untuk Magento 1.x serta Magento 2.

Saya menemukan posting ini oleh Anna Filina di mana dia menemukan satu masalah di Magento 1.9.1 (masih tidak berubah pada 1.9.2), tetapi mengingat bahwa Magento 1 tidak memiliki unit test, saya tidak percaya bahwa ini adalah satu-satunya masalah.

Jadi pertanyaannya adalah: apakah kompatibilitas PHP 7 untuk Magento 1 akan terjamin? Dan karena Magento 2 mungkin telah diuji di PHP 7 (Terima tes otomatis!), Apakah ada masalah yang diketahui?

Fabian Schmengler
sumber
Saya baru saja mencoba Magento 2.1.2 di php7 dan tidak usah pergi.
guru1
@ guru1 Bisakah Anda menjelaskan, mengapa? Dalam pengalaman saya, ini bekerja dengan baik.
Fabian Schmengler
@ guru ... Saya sedang mengembangkan proyek saya di magento 2.1.2 di php 7 dan berfungsi dengan baik. Masalah apa yang Anda hadapi?
Jai

Jawaban:

26

Jika Anda menggunakan versi terbaru, M CE 1.9.2.2, ada ekstensi yang akan membawanya ke kompatibilitas penuh PHP 7: https://github.com/Inchoo/Inchoo/Inchoo_PHP7 . (Penafian: Saya penulis, meskipun ada banyak bantuan dari komunitas.)

Ini juga dapat diinstal melalui Komposer dari http://packages.firegento.com/ .

Semua ketidakcocokan yang disebutkan di sini sudah diperbaiki. Kami pikir mungkin masih ada beberapa kasus tepi, tetapi tidak ada yang berhenti. Pengujian, pelaporan masalah, dan permintaan tarik dipersilakan.

Ivan Čurdinjaković
sumber
itu ide yang sangat buruk untuk meletakkan beberapa penimpaan lokal ...
MagenX
2
@MagenX kecuali Anda Inchoo dan tahu apa yang Anda lakukan;)
7ochem
kita semua melakukan hal-hal bodoh, dari waktu ke waktu .....
MagenX
2
Risiko terbesar dengan penggantian lokal adalah menggunakannya dengan versi magento yang tidak kompatibel, dari yang terlihat penulis tetap memperbarui dengan versi magento terbaru. Dan jika Anda menggunakan Magento versi lama, bermain dengan PHP7 adalah ... Juga, mengikuti praktik terbaik secara membabi buta juga bodoh, ada situasi di mana layak untuk "menghancurkannya". Saya pikir itu hanya satu contoh lagi dari pendekatan "pemujaan kargo". Btw, ekstensi itu luar biasa :)
grizwako
Satu-satunya masalah yang saya miliki di sini adalah dukungan mod. Kami tidak pernah tahu apa yang klien kami ingin gunakan ketika datang ke mod dan harus menguji / memutakhirkan setiap mod agar kompatibel dengan php 7 adalah mimpi buruk.
Bill Garrison
21

Tidak tahu tentang PHP7, tapi saya kira sebagian besar hal masih berlaku di PHP7, Anda dapat menemukan informasi lebih lanjut di blog Matthias Geniar

  • ext / mysql: meskipun merupakan ekstensi MySQL yang sangat lama, saya rasa itu masih sangat banyak digunakan, tapi sudah waktunya semua orang pindah ke pdo_mysql.
  • set_magic_quotes_runtimedan magic_quotes_runtime: sepertinya saya sudah melihat pemberitahuan penghinaan ini sejak ... selamanya?
  • iconv.input_encoding, iconv.output_encoding: sejauh ini, saya belum pernah menggunakan ini ...
  • #komentar gaya dalam file ini: hore untuk konsistensi, saya selalu lebih suka; (titik koma) komentar dalam file .ini!
  • preg_replace()eval modifier: hore untuk sysadmin yang berpikiran keamanan!

Saya pikir satu-satunya hal yang mungkin kita miliki di Magento adalah preg_replace()eval modifier tapi mudah-mudahan tidak.

Selain itu, Magento dikirim 1.9.2 dengan TAF yang diperbarui, Anda dapat menemukan di dev. Dengan ini, Anda harus dapat menjalankan banyak tes frontend pada PHP7 dan memeriksa log sesudahnya

Fabian Blechschmidt
sumber
1
Mengimbangi poin Fabian, taruhan terbaik Anda untuk menguji adalah mulai dengan instalasi 1.9.2 yang bersih, muat data sampel, kemudian jalankan tes TAF. Tidak diragukan lagi akan ada beberapa hal yang menyebabkan kesalahan atau kerusakan, dan mungkin bahkan lebih ketika Anda mulai menambahkan Ekstensi Pihak Ketiga dan penyesuaian apa pun yang mungkin telah Anda tambahkan ke instalasi Anda. Zend telah menguji Magento pada rilis PHP 7 dan saya akan terkejut jika ada masalah besar, meskipun tidak ada BANYAK masalah kecil. Stok 1.9.2 adalah tempat untuk memulai pengujian ....
Bryan 'BJ' Hoffpauir Jr.
Penjelasan yang bagus Fabian..thx
Amit Bera
2
Saya telah menguji Magento 1.9CE pada php7 beta, itu membuat perbedaan besar untuk panel admin ... Tugas katalog dll sangat cepat. Pada toko produk 3000, halaman admin daftar katalog berubah dari pemuatan 12s (php5-fpm) menjadi 3,5s (php7-fpm). Kami ingin menggunakan ini dalam produksi, jadi saya menggunakan nginx untuk merutekan lalu lintas url admin melalui php7, dan menjaga lalu lintas yang menghadap depan pada php5-fpm untuk saat ini. Sangat senang untuk rilis php7 :)
Ricky Odin Matthews
@RickyOdinMatthews Bagaimana ini berhasil untuk Anda? Masih menjalankan admin hanya di php7? Ada masalah? Bisakah Anda membagikan bagian dari konfigurasi NGINX yang merutekan admin ke php7?
Ottonet
1
@Ottonet ya, masih menggunakannya di admin. Saya telah meletakkan ekstrak conf 'default' saya di sini untuk Anda pastebin.com/9z1U94ug
Ricky Odin Matthews
13

Tidak ada komentar tentang Magento 1, tetapi Magento 2 memang memiliki beberapa masalah dengan nama kelas seperti "String". Tidak butuh waktu lama untuk memperbaikinya, tetapi tidak berhasil. Saya berharap Magento 2 akan diperbaiki, tetapi mungkin belum diperbaiki karena prioritas lain terlebih dahulu.

Alan Kent
sumber
1
Terima kasih Alan untuk informasinya. Untuk referensi, ini adalah masalah Github: github.com/magento/magento2/issues/1367 (masih ada kata-kata lain seperti "objek" yang tampaknya)
Fabian Schmengler
3
Keadaan saat ini: nama kelas diperbaiki dalam pengembangan cabang, tidak ada masalah yang lebih dikenal
Fabian Schmengler
10

Hampir siap. Saya mencoba menjalankan Magento 1.9.2.1 yang bersih dengan PHP 7 RC1, yang mengakibatkan crash instan (kesalahan fatal) dari Magento. Setelah memperbaiki masalah ini, semuanya tampak berfungsi, kecuali backend, yang saya tidak dapat masuk. Kemudian ternyata menjadi masalah terkait sesi yang dapat ditambal.

Secara singkat:

  1. Kesalahan fatal dapat diperbaiki dengan Mage_Core_Model_Layoutmengganti lalu mengubah baris 555 dari:
    $out .= $this->getBlock($callback[0])->$callback[1]();
    menjadi
    $out .= $this->getBlock($callback[0])->{$callback[1]}();

  2. Masalah sesi sementara bisa diperbaiki dengan menimpa Mage_Core_Model_Session_Abstract_Variendan menulis ulang getData, setData, unsetData, addFullNamesmetode, sehingga di mana-mana di mana $this->_datadigunakan, maka akan diganti oleh $_SESSION.

Jika seseorang tertarik dengan solusinya, dapat ditemukan di sini .

Zsolti
sumber
1
Tentu saja seseorang tertarik pada solusinya ;-) Bisakah Anda meringkas konten artikel yang ditautkan? Tidak ada yang salah dengan menautkan blog Anda dengan informasi tambahan, tetapi jawabannya harus dapat berdiri sendiri.
Fabian Schmengler
Nah, pertanyaannya adalah apakah Magento siap untuk PHP 7, bukan tentang bagaimana membuat mereka bekerja bersama. Bagaimanapun, saya telah memperbarui jawaban saya dengan solusi singkat.
Zsolti
1
Kesalahan serupa terjadi pada Varien_File_Uploader, lihat magento.stackexchange.com/questions/93066/…
Fabian Schmengler
Sama untuk 1.9.2.4
lrkwz
8

Magento2 siap untuk PHP 7. Adaptasi kode ke PHP7 telah dilakukan dan semua perubahan tersedia di mengembangkan cabang. Lihat masalah pada GitHub

Juga, dukungan php 7 di Magento1 memerlukan perubahan yang tidak kompatibel ke belakang dan saya pikir tidak akan didukung secara resmi.

KAndy
sumber
Sungguh menakjubkan bahwa M2 dan PHP 7 akan dirilis pada bulan yang sama - November 2015!
FireBear
7

Ada masalah dengan bagaimana Magento menghitung total pesanan, dan menerapkan diskon. Ini juga menghentikan checkout Paypal express, karena item baris tidak menambahkan hingga total keseluruhan dengan diskon.

Masalahnya tampaknya bahwa Mage_Sales_Model_Config_Ordered::_compareTotals()tidak berfungsi sama di PHP7 dengan PHP5, dan uasort()sekarang mengandalkan hubungan transitif untuk pemesanan, tetapi ini tidak harus untuk total pesanan.

Coba gunakan: -

protected function _getSortedCollectorCodes()
{
    if (Mage::app()->useCache('config')) {
        $cachedData = Mage::app()->loadCache($this->_collectorsCacheKey);
        if ($cachedData) {
            return unserialize($cachedData);
        }
    }
    $configArray = $this->_modelsConfig;
    // invoke simple sorting if the first element contains the "sort_order" key
    reset($configArray);
    $element = current($configArray);
    if (isset($element['sort_order'])) {
        uasort($configArray, array($this, '_compareSortOrder'));
    } else {
        foreach ($configArray as $code => $data) {
            foreach ($data['before'] as $beforeCode) {
                if (!isset($configArray[$beforeCode])) {
                    continue;
                }
                $configArray[$code]['before'] = array_unique(array_merge(
                    $configArray[$code]['before'], $configArray[$beforeCode]['before']
                ));
                $configArray[$beforeCode]['after'] = array_merge(
                    $configArray[$beforeCode]['after'], array($code), $data['after']
                );
                $configArray[$beforeCode]['after'] = array_unique($configArray[$beforeCode]['after']);
            }
            foreach ($data['after'] as $afterCode) {
                if (!isset($configArray[$afterCode])) {
                    continue;
                }
                $configArray[$code]['after'] = array_unique(array_merge(
                    $configArray[$code]['after'], $configArray[$afterCode]['after']
                ));
                $configArray[$afterCode]['before'] = array_merge(
                    $configArray[$afterCode]['before'], array($code), $data['before']
                );
                $configArray[$afterCode]['before'] = array_unique($configArray[$afterCode]['before']);
            }
        }
        foreach ($configArray as $code => $data) {
           $largest_small = $smallest_large = 0;
           foreach ($data['after'] as $afterCode) {
              if(isset($configArray[$afterCode]['sort_order']) && $largest_small < $configArray[$afterCode]['sort_order'])
                 $largest_small = $configArray[$afterCode]['sort_order'];
           }
           foreach ($data['before'] as $beforeCode) {
              if(isset($configArray[$beforeCode]['sort_order']) && ($smallest_large == 0 || $configArray[$beforeCode]['sort_order'] < $smallest_large)) 
                 $smallest_large = $configArray[$beforeCode]['sort_order'];
           }
           if($smallest_large <= $largest_small+1){
              if($smallest_large == 0) $smallest_large = $largest_small+1;
              $add = $largest_small+2-$smallest_large;
              foreach ($configArray as $code1 => $data1) {
                 if(!isset($data1['sort_order'])) break;
                 if($smallest_large <= $data1['sort_order'])
                    $configArray[$code1]['sort_order'] += $add;
               }
           }
           $configArray[$code]['sort_order'] = $largest_small+1;
        }
        uasort($configArray, array($this, '_compareSortOrder'));
    }
    $sortedCollectors = array_keys($configArray);
    if (Mage::app()->useCache('config')) {
        Mage::app()->saveCache(serialize($sortedCollectors), $this->_collectorsCacheKey, array(
                Mage_Core_Model_Config::CACHE_TAG
            )
        );
    }
    return $sortedCollectors;
}
Dallas Clarke
sumber
Luar biasa, memakukan pajak aneh + 20% saya di atas total.
evensis
6

Ini adalah penelitian saya, saya ingin berbagi dengan Anda tentang ketidakcocokan magento php7. Saat ini saya telah menemukan beberapa tempat di mana kode harus gagal karena sintaks variabel seragam.

File: app / code / core / Mage / ImportExport / Model / Ekspor / Entitas / Produk / Jenis / Abstract.php

Metode: overrideAttribute

$data['filter_options'] = $this->$data['options_method']();

File: app / code / core / Mage / ImportExport / Model / Ekspor / Entitas / Pelanggan.php

Metode: filterAttributeCollection

$data['filter_options'] = $this->$data['options_method']();

File: app / code / core / Mage / ImportExport / Model / Import / Uploader.php

Metode: _validateFile

$params['object']->$params['method']($filePath);

File: app / code / core / Mage / Katalog / Model / Produk / Tautan / Api / V2.php

Metode: tetapkan

if (isset($data->$attribute['code'])) {
    $links[(int)$linkedProductId][$attribute['code']] = $data->$attribute['code'];
}

File: app / code / core / Mage / Katalog / Model / Produk / Tautan / Api / V2.php

Metode: pembaruan

$data->$attribute['code']

File: lib / Varien / File / Uploader.php

Metode: _validateFile

$params['object']->$params['method']($this->_file['tmp_name']);

File: app / code / core / Mage / Core / Model / Layout.php

Metode: getOutput

$out .= $this->getBlock($callback[0])->$callback[1]();
Detzler
sumber
5

Selain jawaban lain yang terkait dengan Magento 1:

Ketidakcocokan PHP 7 di Zend_XmlRpc_Servertelah diperbaiki di Zend Framework 1.12.12

Semua versi sebelum CE 1.9.2.2 / EE 1.14.2.2 menggunakan versi Zend Framework yang lebih lama, sehingga mungkin memiliki masalah jika Anda menggunakan API XML-RPC dari Magento.

Fabian Schmengler
sumber
1

Saya menggunakan Magento 2 CE Versi 2.1.4 & Bekerja dengan baik.

magento \ app \ bootstrap.php

if (!defined('PHP_VERSION_ID') || !(PHP_VERSION_ID >= 50005 && PHP_VERSION_ID < 50700 || PHP_VERSION_ID === 70002 || PHP_VERSION_ID === 70004 || PHP_VERSION_ID >= 70006)) {
    if (PHP_SAPI == 'cli') {
        echo 'Magento supports PHP 5.6.5, 7.0.2, 7.0.4 and 7.0.6 or later. ' .
            'Please read http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html';
    } else {
        echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <p>Magento supports PHP 5.6.5, 7.0.2, 7.0.4 and 7.0.6 or later. Please read
    <a target="_blank" href="http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html">
    Magento System Requirements</a>.
</div>
HTML;
    }
    exit(1);
}
Ankit Shah
sumber
1

Jawaban singkatnya adalah tidak, tidak. Magento CE 1.9.2.4 hanya mendukung PHP 5.4 dan 5.5 secara resmi. Dan sementara PHP 5.6 menjalankannya dengan baik, itu menjenuhkan file log dengan banyak pesan peringatan.

Jawaban panjangnya adalah relatif mudah untuk memodifikasinya untuk menjalankan dukungan PHP7. Namun banyak ekstensi yang masih belum kompatibel dengan PHP7 sehingga Anda sebagian besar mandiri.

Sheshgiri Anvekar
sumber
0

PHP 7.0 adalah Akhir dari kehidupan sejak minggu pertama Desember 2018.

Pada posting ini, versi Magento 2.2.3 saat ini (20 Februari 2018 rilis) tidak mendukung PHP 7.1, atau PHP 7.2.

Anda dapat mengonfirmasi versi yang didukung dengan memeriksa app/bootstrap.phpdi folder pemasangan Magento Anda, dan mencari kode yang serupa dengan yang berikut:

/* PHP version validation */
if (!defined('PHP_VERSION_ID') || !(PHP_VERSION_ID === 70002 || PHP_VERSION_ID === 70004 || PHP_VERSION_ID >= 70006)) {
    if (PHP_SAPI == 'cli') {
        echo 'Magento supports 7.0.2, 7.0.4, and 7.0.6 or later. ' .
            'Please read http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html';
    } else {
        echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <p>Magento supports PHP 7.0.2, 7.0.4, and 7.0.6 or later. Please read
    <a target="_blank" href="http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html">
    Magento System Requirements</a>.
</div>
HTML;
    }
    exit(1);
}

Tampaknya juga ada masalah .htaccessyang menyebabkan 500 kesalahan dengan apache 2.4.

Selain itu, file komposer yang disertakan hanya berisi dependensi untuk php5.5

Kraang Prime
sumber