Cara Membuat PHP Build Kemarin Menjadi Portable

Cara Membuat PHP Build Kemarin Menjadi Portable

Table of Contents

Masih ingat dengan artikel cara build PHP yang kemarin?

Di artikel tersebut saya bilang "... Sepertinya Portable". Kalimat tersebut ada di Judulnya.

Jujur saja saya waktu itu benar-benar ragu apakah benar hasil build PHP tersebut portable.

Itu karena, saat development kita menginstall library pihak ketiga sebelum melakukan build.

Walaupun PHP tadi berjalan di komputer tempat build-nya, bagaimana jika PHP tadi dijalankan di linux distro lain secara fresh install?

Nah. Untuk menutup keraguan tersebut, sekarang saya akan membahas cara membuat PHP build kemarin benar-benar portable.

Di sini saya menggunakan format AppImage agar yakin bahwa PHP build-nya portable.

Namun. Saya akan membahas ini untuk PHP versi 8.4.x saja, karena yang lain langkahnya kurang lebih sama.

Bagaimana caranya? Terus simak...

Menyiapkan Bahan yang Diperlukan

Sebelum kita mulai:

  • Download aplikasi linuxdeploy sesuai architecture cpu Anda. 
  • Download aplikasi appimagetool sesuai architecture cpu Anda.
  • Siapkan gambar svg dan rename jadi "logo.svg".
  • Siapkan PHP build untuk versi 8.4.x kemarin. Ambil dari folder executablenya.

Rename hasil download link linuxdeploy tadi menjadi "linuxdeploy".

Rename hasil download link appimagetool tadi menjadi "appimagetool".

Pindahkan kedua file executable tadi ke "/usr/local/bin".

Kemudian jalankan perintah ini:

sudo chmod +x /usr/local/bin/linuxdeploy
sudo chmod +x /usr/local/bin/appimagetool

Mempersiapkan Folder untuk AppImage Development

Buat folder baru bernama "php84"

Di dalamnya buat folder baru bernama "php84.AppDir".

Buat folder:

  • php84.AppDir/usr
  • php84.AppDir/usr/bin
  • php84.AppDir/usr/lib
  • php84.AppDir/usr/share
  • php84.AppDir/etc

Buat file "php84.AppDir/AppRun", isi dengan:

#!/bin/bash

exec "$APPDIR/usr/bin/php" -c "$APPDIR/etc/php/php.ini" -z "$APPDIR/usr/lib/php/extensions/no-debug-non-zts-20240924/opcache.so" "$@"

Copy seluruh isi "php84/bin/" dari folder build kemarin ke "php84.AppDir/usr/bin/"

Copy folder "php84/lib/php" dari folder build kemarin ke "php84.AppDir/usr/lib/php"

Copy "php.ini-production" dari paket source code php 8.4.x kemarin ke "php84.AppDir.usr/etc/php/php.ini".

Cari settingan php.ini terkait extension, ubah menjadi seperti di bawah ini, tapi sisanya biarkan apa adanya:

# ...

;extension=bz2
extension=curl
;extension=ffi
extension=ftp
;extension=fileinfo
extension=gd
extension=gettext
;extension=gmp
extension=intl
;extension=ldap
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
;extension=odbc
extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_odbc
;extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
extension=shmop

; The MIBS data available in the PHP distribution must be installed.
; See https://www.php.net/manual/en/snmp.installation.php
;extension=snmp

extension=soap
extension=sockets
;extension=sodium
extension=sqlite3
;extension=tidy
;extension=xsl
extension=zip

zend_extension=opcache

# ...

[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1

#...

Di dalam folder "php84.AppDir", jalankan perintah ini:

linuxdeploy --appdir . --output appimage

Nanti kemungkinan besar hasilnya error, tapi akan dibuatkan folder-folder pendukungnya di dalam "php84.AppDir".

Selanjutnya, copy logo.svg ke "php84.AppDir/usr/share/icons/hicolor/scalable/apps/logo.svg"

Selanjutnya, buat file "php84.AppDir/usr/share/applications/php84.desktop", kemudian isi dengan:

[Desktop Entry]
Name=PHP84
Exec=php
Icon=logo
Type=Application
Categories=Development;

Keterangan:

  • Name berisi nama aplikasi, saya beri nama PHP84.
  • Icon berisi nama file logo.svg tanpa extension (.svg)
  • Exec berisi nama binary ELF php utama yang ada di "php84.AppDir/usr/bin", yakni php.
  • Type tulis saja Application
  • Categories tidak bisa sembarangan, sekarang isi dengan "Development". Selengkapnya, bisa lihat di sini.

Jalankan lagi perintah tadi:

linuxdeploy --appdir . --output appimage

Walaupun kemungkinan ada pesan error, tapi hasilnya sudah benar. jadi, lanjut ke langkah berikutnya.

Naik satu folder ke atas:

cd ..

Jalankan perintah ini:

appimagetool php84.AppDir

Setelah selesai file berextension .AppImage akan muncul di folder ini.

Pengujian

Copy dan rename file berextension .AppImage tadi menjadi "php84-test".

Izinkan jadi executable dengan perintah ini:

sudo chmod +x php84-test

Masih di folder yang sama, buat file "index.php", isi dengan script ini:

<?php

phpinfo();

Jalankan perintah ini:

./php84-test -z opcache.so

Jika ada pesan semacam "..loaded" di terminal, berarti opcache berhasil berjalan.

Selanjutnya:

./php84-test -S 127.0.0.1:9090

Kemudian buka http://127.0.0.1:9090

Pastikan modul-modul php yang telah dienable muncul di halaman phpinfo tadi.

Akhir Kata

Sepertinya cukup sekian.

Jika ada error atau yang semacamnya, silakan pahami apa yang kurang berdasarkan pesan errornya.