Versi php apa yang digunakan drupal 8?

PHP 8 beta 4 keluar. Faktanya, kemungkinan besar saat Anda membaca ini, kita mungkin sudah memiliki RC pertama

PHP 8 menambahkan banyak fitur baru yang menarik, tetapi pada saat yang sama, sebagai versi utama, ini merusak banyak perilaku dan fungsi sebelumnya.

Mendapatkan Drupal untuk bekerja pada PHP 8 tidak sesederhana membuatnya bekerja pada rilis minor baru seperti PHP 7. 4

Komunitas Drupal mulai merencanakan untuk memperbaiki masalah kompatibilitas sejak dini. Dan saat rilis mulai diluncurkan, ada masalah individual untuk mengatasi setiap penghentian, mengubah tanda tangan metode, dan perubahan yang dapat merusak lainnya. Perbaikan ini mengalami satu masalah sehingga kami dapat menjalankan satu pengujian terhadap PHP 8. Itu adalah tambalan yang saya mulai ketika saya ingin menguji Drupal 9 dengan PHP 8. Agar lebih menyenangkan, saya juga menggunakan Composer 2 untuk semua langkah ini

Mengapa saya menulis ini?

Jelas bahwa artikel ini mungkin tidak memiliki nilai sama sekali ketika Drupal 9 secara resmi mendukung PHP 8, bersama dengan semua dependensinya. Mengapa saya menulis ini? . Ini berfungsi sebagai dokumentasi yang dapat membantu selama proses eksperimen. Kedua, saya berharap sebagian dari artikel ini akan bermanfaat bagi orang-orang yang mencoba memutakhirkan aplikasi kompleks mereka sendiri untuk bekerja dengan PHP 8

Tantangan yang saya jelaskan di sini lebih relevan untuk aplikasi yang perlu mendukung spektrum versi PHP, bukan hanya satu atau dua

Drupal 8 mendukung PHP 7. 0 sampai 7. 4 sekarang dan masalah yang saya sebutkan sebelumnya juga mencoba menambahkan dukungan untuk PHP 8 ke Drupal 8. 9 juga [sepertinya itu mungkin terjadi juga]. Hal ini membuat tantangan untuk mendukung PHP 8 di Drupal menjadi lebih besar karena kami harus mendukung beberapa perubahan besar secara bersamaan

Selain itu, banyak masalah mungkin tidak relevan dengan aplikasi yang harus berjalan di satu versi PHP karena mereka hanya perlu mengubah kode agar sesuai dengan perubahan di PHP 8

Saya juga tidak akan mencoba menjelaskan semua perubahan yang terjadi untuk mendukung PHP 8. Saya hanya akan berbicara tentang bagian-bagian yang saya analisis, ulas, atau ubah sendiri. Dengan semua itu, mari kita mulai

Masalah 1. Lingkungan dan penyiapan awal

Docker sangat bagus untuk menyiapkan lingkungan cepat untuk pengujian dan pengembangan. Di Axelerant, kami biasanya menggunakan Lando untuk menyiapkan proyek [pada kenyataannya, alat template proyek kami mendukung pembuatan scaffold default untuk Lando]. Tapi itu tidak sesuai dengan kebutuhan saya di sini karena Lando belum mendukung PHP 8. Lagi pula, komposisi buruh pelabuhan jauh lebih sederhana untuk hal seperti ini. Saya hanya membutuhkan dua layanan untuk memulai–wadah server web [dengan PHP] dan database

Komunitas Docker dan PHP mempertahankan titik awal yang baik dalam bentuk gambar PHP Docker resmi dalam berbagai rasa. CLI, FPM, dan dengan Apache di Buster. Kami menggunakan yang terakhir di sini dan menambahkan berbagai ekstensi dan pengaturan PHP yang dioptimalkan untuk Drupal. Saya sudah mengelola koleksi gambar PHP yang dioptimalkan Drupal dan saya hanya mengadaptasinya agar berfungsi dengan gambar PHP 8 beta 4. Satu-satunya perbedaan adalah karena pecl tidak lagi disertakan dengan PHP [mulai dari PHP 8], saya baru saja menghapus baris tersebut. Itu berarti ekstensi PHP umum seperti APCu dan YAML tidak akan tersedia, tetapi tidak apa-apa untuk upaya pertama. [Saya akhirnya menambahkannya di gambar. ]

Layanan lain dalam file docker-compose adalah untuk MariaDB dan saya menggunakan versi Docker Bitnami di sini. Ada yang resmi, tapi saya lebih terbiasa dengan yang Bitnami karena Lando menggunakannya. Saya tidak melakukan pengaturan mewah dengan MariaDB karena ini hanya untuk eksperimen. Anda dapat melihat file docker-compose. yml dan Dockerfile di Github. Selain lingkungan Docker, kami juga memerlukan penyiapan situs Drupal. Untungnya, ini sangat mudah dengan alat template yang saya sebutkan sebelumnya. Setelah alat axl-template terinstal, saya langsung menjalankan perintah ini

init-drupal hussainweb/test-d9p8c2 --core-version "^9. 1@dev"

Biasanya, ini sudah cukup untuk titik awal yang baik, tetapi template dioptimalkan untuk komposer 1. Itu termasuk paket-paket tertentu yang meningkatkan kinerja komposer dengan Drupal. Namun, saya ingin menggunakan komposer 2 dan paket tersebut tidak diperlukan. Bahkan, mereka tidak bekerja. Jadi, setelah perintah init-drupal di atas, paket tersebut saya hapus sebelum mengupgrade composer ke versi 2. Saya juga mengupdate composer-patch ke rilis dev terbaru, yang memiliki pernyataan "require" yang diperbarui untuk bekerja dengan composer 2

komposer menghapus zaporylie/composer-drupal-optimizations
komposer membutuhkan cweagans/composer-patch. "^1. 0@dev"

Sekarang, saya baik memperbarui komposer ke versi terbaru [2. 0 RC1 pada tulisan ini]

pembaruan diri komposer --2

Pada saat penulisan ini, plugin composer-patches tidak bekerja dengan composer 2. Saya memiliki PR yang terbuka untuk perbaikan terakhir [sampai sekarang] dan saya baru saja menggunakan fork saya sebagai repositori untuk paket tersebut. Biasanya, di dunia Drupal, saya akan mencoba menerapkan tambalan, tetapi plugin yang bertanggung jawab untuk menerapkan tambalan rusak di sini. Bagaimanapun, menggunakan garpu lebih baik. Komitmen ini menunjukkan bagaimana saya menggunakan garpu saya, yang bekerja dengan baik dengan komposer 2. Pada saat Anda membaca ini, Anda mungkin tidak perlu melakukan ini sama sekali

Hal lain yang perlu diperhatikan adalah mesin lokal saya masih menjalankan PHP 7. 4. Ini penting karena banyak dependensi Drupal tidak mendukung PHP 8 dan tidak dapat diinstal [kecuali jika kita menggunakan flag --ignore-platform-requirements]

Ini cukup baik untuk menjalankan lingkungan dasar. Putar kontainer buruh pelabuhan dan temukan port yang diekspos oleh kontainer [lihat buruh pelabuhan ps -a]. Akses situs tersebut, dan Anda mungkin melihat pesan kesalahan

Masalah dengan dependensi

Drupal dibangun di atas banyak paket dan komponen di dunia PHP dan mereka harus mendukung PHP 8 juga. Saat ini, sebagian besar komponen ini tidak dapat diinstal dengan mudah di PHP 8 karena persyaratan di komposernya. json. Namun, saya menjalankan komposer di mesin lokal saya, yang masih menjalankan PHP 7. 4 dan karenanya, tidak ada keluhan tentang PHP 8. Ini jelas merupakan risiko dan kami tidak boleh melakukan ini di situs produksi [setidaknya Anda tidak boleh menggunakan PHP 8 beta untuk produksi sekarang]. Tetapi untuk percobaan ini, saya ingin mencoba menjalankan komponen tersebut di PHP 8 terlepas dari komposernya. pembatasan json. Kabar baiknya adalah tidak ada komponen tersebut yang menyebabkan masalah dalam pengujian saya sejauh ini

Tentu saja, ini adalah pemblokir untuk menambahkan dukungan PHP 8 untuk Drupal dan dilacak dalam masalah ini

Masalah 2. Perbaiki kesalahan Drupal

Pertama, saya menghadapi masalah dengan deklarasi metode yang tidak sesuai dalam doktrin/refleksi. Masalahnya ada pada metode getConstants dan newInstance dan saya secara manual memperbaiki kedua instance tersebut [itu sepele] dan bergerak maju. Ternyata mereka sudah diperbaiki di tambalan dan saya tidak perlu khawatir tetapi saya melanjutkan

Perbaikan ini setidaknya membuat halaman instalasi Drupal dimuat dan saya membuka halaman tempat kami memasukkan detail database. [Saya akhirnya mengkonfigurasi. env dan tidak pernah melihat halaman itu lagi, tapi itu tidak penting. ] Pada langkah ini, saya melihat kesalahan terkait tanda tangan metode yang tidak valid untuk metode PDO. Di PHP 8, tanda tangan metode PDOStatement. fetchAll dan PDOSstatement. ambil telah berubah. Sayangnya, Drupal 8 dan 9 memiliki tanda tangan lama. Ini sekarang perlu diubah untuk PHP 8. Tetapi mengubahnya akan merusak dukungan untuk PHP 7 dan ini menimbulkan komplikasi

Solusinya adalah peretasan yang agak brilian oleh Alex Pott di mana kami memperkenalkan dua antarmuka – satu untuk PHP 7 dan yang lainnya untuk PHP 8. Bergantung pada versi PHP, kami alias antarmuka yang relevan yang digunakan oleh kelas sebenarnya. Kemudian, untuk menangani kedua tanda tangan metode, kami memiliki dua ciri yang berbeda–satu lagi untuk PHP 7 dan yang lainnya untuk PHP 8. Kami sekali lagi membuat alias sifat yang relevan tergantung pada versi PHP, yang digunakan di kelas. Ini terlihat seperti ini

jika [PHP_VERSION_ID >= 80000] {
class_alias['\Drupal\Core\Database\Php8StatementInterface',  '\Drupal\Core\Database\StatementInterfaceBase'];
}
kalau tidak {
class_alias['\Drupal\Core\Database\Php7StatementInterface',   '\Drupal\Core\Database\StatementInterfaceBase'];
}
antarmuka StatementInterface memperluas StatementInterfaceBase, \Traversable {
//
}

Demikian pula, ciri-cirinya adalah alias dan masing-masing ciri memanggil metode pembantu baru di kelas Pernyataan yang sebenarnya [namanya baru saja diganti dari metode sebelumnya]. Misalnya, metode fetchAll yang dulu sekarang akan menjadi doFetchAll dan karena namanya berbeda, tidak masalah signature apa yang dimilikinya. Metode fetchAll sekarang akan berada dalam sifat yang relevan dengan tanda tangan yang sesuai tergantung pada versi PHP dan hanya akan memanggil metode doFetchAll. Dengan cara ini, kami memiliki dua tanda tangan metode yang berbeda di antarmuka dan sifat tergantung pada versi PHP

Perubahan di atas dapat ditinjau dalam tambalan pada masalah yang sedang dikerjakan pada saat penulisan ini. Ketika saya menguji, tambalan hanya berisi dukungan untuk tanda tangan yang berbeda untuk metode pengambilan. Selanjutnya, tanda tangan untuk metode fetchAll juga telah berubah dan saya menambahkan dukungan untuk itu di tambalan. Ini memecahkan masalah dengan menginstal Drupal. Saya terkejut dan senang karena tidak ada lagi kesalahan selama sisa penginstalan dan bahkan ketika saya disambut dengan beranda situs baru saya yang menjalankan Drupal 9. 1 dan PHP8

Sebelum saya melanjutkan ke masalah berikutnya, saya harus mencatat bahwa masalah di sini dengan PDOStatement benar-benar karena kesalahan dalam desain.

Sebagai pengembang, kita tidak boleh secara langsung bergantung pada API dari sesuatu yang tidak dapat kita kendalikan secara langsung. Versi PHP adalah sesuatu yang tidak dapat kami kendalikan sebagai pengembang inti Drupal. Kami pasti membutuhkan versi minimum PHP tetapi kami tidak dapat mengontrol PHP untuk mengontrol dependensi lainnya

Menjalin logika bisnis kami dengan API PHP membawa risiko seperti ini. Seperti yang dikatakan Alex Pott di , “Ini bukan metode kami. Ini dari \PDOStatement dan tanda tangannya dimiliki oleh PHP dan bukan oleh Drupal. ”

Untungnya, Drupal menawarkan cakupan kode yang tinggi dalam pengujian otomatis dan pemfaktoran ulang bisa seaman yang kami harapkan. Mungkin masih ada masalah dengan modul kontribusi yang mungkin memperluas metode ini dan bergantung pada implementasi Drupal di atas pembungkus PHP. Dalam produk yang kompleks seperti Drupal, sangat sulit untuk memfaktorkan ulang kode seperti ini

Masalah 3. Rute dinamis

Saya sangat gembira dengan penginstalan yang berfungsi di PHP 8 dan ingin menguji lebih lanjut, sambil tetap memperhatikan log kesalahan. Saya menemukan beberapa kesalahan ceruk dalam bagaimana Drupal berperilaku pada rute dinamis tetapi ternyata menjadi masalah dengan perubahan PDOStatement. fetchAll dan bagaimana perilakunya dengan parameter opsional. Itu sangat berantakan dan saya senang PHP 8 mengubah tanda tangan metode untuk menggunakan variadics. Masalahnya di sini adalah bagaimana ciri-ciri membungkus panggilan ke metode aktual kelas Pernyataan yang relevan. Saya harus menggunakan saklar jelek. case block untuk memperhitungkan jumlah parameter yang mirip dengan cara penanganannya di inti Drupal. Anda dapat melihat perubahan di

Masalah 4. peringatan CKEditor

Saya melihat beberapa peringatan dicatat oleh CKEditor ketika saya membuka formulir tambah/edit node. Peringatan dari metode yang disebut CKEditorPluginManager. getEnabledButtons dan itu karena bagaimana parameter tertentu diteruskan ke callback untuk array_reduce. Untungnya, ini ternyata menjadi perbaikan yang mudah karena sama sekali tidak perlu melewati parameter itu dengan referensi dan tambalan dengan cepat dilakukan. Masalah berisi lebih banyak detail dan kode contoh untuk mereproduksi masalah

Langkah selanjutnya

Jika Anda ingin mengujinya sendiri, temukan kode saya di sini dan siapkan sendiri secara lokal. Anda memerlukan komposer dan Docker dan berharap ini cukup jelas, tetapi saya akan segera menambahkan dokumentasi ke repositori

Saya dapat menjalankan Drupal 9 dan melakukan banyak tindakan di PHP 8. Tetapi tidak banyak orang yang membutuhkan inti Drupal saja. Untuk menguji situs yang kompleks, saya perlu menguji fitur sebanyak mungkin dalam modul inti dan juga modul kontribusi. Saya akan menulis tentang ini di posting selanjutnya dan bahkan mungkin melakukan benchmark sederhana membandingkan PHP 7. 4 dan 8. 0 kinerja

Lihat bagian selanjutnya dari seri ini - Tingkatkan Drupal ke PHP 8. Menyusun Ekstensi dan perhatikan lebih lanjut.  

tentang Penulis

tentang Penulis

Hussain Abbas, Direktur Layanan PHP & Drupal

Hussain adalah seorang ambivert yang tenang yang akan mengejutkan Anda dengan selera humornya [dan keterampilan memasaknya yang luar biasa]. Fanatik fiksi ilmiah dan fantasi kami

Apakah Drupal 8 mendukung PHP 8?

Sebagai Drupal 8. x telah mencapai akhir hidupnya dengan Drupal. org , tidak ada versi Drupal 8. x kompatibel dengan PHP 8. 0 .

Apakah PHP7. 4 masih didukung?

PHP 7. 4 menikmati dukungan aktif dari 2019 hingga akhir 2021 . PHP 7. 4 satu tahun dukungan keamanan berakhir hari ini. Semua aplikasi PHP yang berjalan pada versi PHP 5 atau 7 apa pun sangat disarankan untuk memutakhirkan PHP 8.

Akankah Drupal 7 mendukung PHP 8?

[1] Versi PHP minimum yang direkomendasikan untuk Drupal 7 adalah PHP 7. 2. x hingga akhir masa pakai resminya pada 30 November 2020. [2] Beberapa vendor seperti RedHat/CentOS dan Ubuntu LTS menawarkan dukungan tambahan untuk versi PHP ini, hubungi vendor Anda. [3] Versi Drupal 7 terbaru disarankan untuk mendapatkan dukungan penuh PHP 8 .

Bagaimana cara mengubah versi PHP di Drupal?

Panduan peningkatan langkah demi langkah .
Langkah 1. tingkatkan semuanya ke versi terbaru + pembaruan basis data. Hal pertama yang perlu Anda lakukan adalah membawa semuanya ke versi terbaru. .
Langkah 2. tingkatkan mesin host / VM / wadah Anda ke PHP 8. .
Langkah 3. atur komposer Anda. .
Langkah 3. Periksa kode Anda untuk kompatibilitas

Bài mới nhất

Chủ Đề