Sebagai seseorang yang jatuh cinta dengan PHP, bekerja dengan bahasa ini selama hampir 10 tahun, dan kemudian pindah ke negara lain sebagai Insinyur Perangkat Lunak, di mana sebagian besar pengalaman saya adalah dalam PHP, saya selalu merasa iri dengan bahasa pemrograman lain yang memiliki alat yang baik untuk menangani konkurensi.
Saya tidak yakin apakah suatu hari PHP bisa mencapai titik tersebut, dan saya berasumsi bahwa ini mungkin bukan sesuatu yang sedang diupayakan. Saya harus mengakui bahwa saya menikmati bekerja dengan Promises di JavaScript. Saya juga menyukai bagaimana konkurensi diimplementasikan di Go dengan channels, select, goroutines, dan fitur lainnya. Jadi, ketika bekerja dengan PHP, saya merasa ada sesuatu yang kurang.
Namun, di tahun 2024 ini, segalanya tampak berbeda. Saya sangat bersemangat dengan semua kolaborasi dan alat baru yang telah ditambahkan ke komunitas PHP dan proyek-proyeknya. Bahasanya tampak lebih stabil, alat-alatnya tampak lebih matang, dan banyak perusahaan, termasuk startup dan perusahaan besar, dibangun di atas PHP. Mengenai startup, saya tidak bisa memikirkan opsi lain yang lebih baik untuk membentuk produk selain menggunakan framework PHP!
Inovasi Terbaru dalam PHP
Ada beberapa hal yang menurut saya sangat berharga dan layak untuk dicoba:
- Laravel Octane
- FrankenPHP
Apa Itu Konkurensi?
Dalam ilmu komputer, konkurensi adalah kemampuan dari berbagai bagian atau unit dari sebuah program, algoritma, atau masalah untuk dieksekusi tidak sesuai urutan atau dalam urutan parsial, tanpa mempengaruhi hasil akhir.
– Wikipedia
Bayangkan Anda sedang bekerja dengan skrip CLI yang melakukan tugas-tugas yang memakan waktu dan bisa dipecah menjadi tugas-tugas yang lebih kecil. Ini bisa berupa pemanggilan beberapa endpoint REST, menyimpan dan membaca data ke dalam basis data, perubahan sistem file, atau tugas lainnya. Biasanya dalam PHP, kode berjalan baris demi baris dan thread utama selalu melakukan satu hal pada satu waktu. Kita tidak memiliki forking dan joining thread anak ke thread utama secara default, tetapi kita bisa memanfaatkan paket kecil dari composer untuk mencapai itu. Yang perlu Anda lakukan adalah menambahkan paket spatie/fork ke proyek Anda. Paket ini membutuhkan modul pcntl dan sockets untuk bekerja. Pastikan Anda memiliki modul ini dalam proyek Anda.
Jika Anda menjalankan php -m
di terminal Anda, Anda harus melihat modul-modul ini sebagai berikut:
shellCopy code[PHP Modules]
...
pcntl
sockets
...
Saatnya Koding
Bayangkan Anda memiliki fungsi yang lambat dan Anda bergantung pada hasilnya. Yang dilakukan fungsi ini adalah menghitung dari 0 hingga 100 juta.
phpCopy codefunction timeConsumingFunction($to = 100000000): int
{
$sum = 0;
for ($i = 0; $i < $to; $i++) {
$sum++;
}
return $sum;
}
Biasanya kita menulis sesuatu seperti ini:
phpCopy codeecho array_sum(
[
timeConsumingFunction(),
timeConsumingFunction(),
timeConsumingFunction(),
]
);
Berapa lama waktu yang dibutuhkan? Mari kita uji waktu:
phpCopy code$start_time = microtime(TRUE);
echo "Result: " . array_sum(
[
timeConsumingFunction(),
timeConsumingFunction(),
timeConsumingFunction(),
]
);
$end_time = microtime(TRUE);
echo PHP_EOL . "Time: " . $end_time - $start_time;
Seperti yang dapat Anda lihat pada output di bawah ini, waktu yang dibutuhkan sekitar 4 detik. Ini dapat bervariasi berdasarkan kekuatan komputasi, memori, dan lain-lain. Tugas kita ini cukup intensif terhadap CPU.
Menggunakan Fork untuk Konkurensi
Sekarang, mari kita tulis kode ini dengan cara yang berbeda menggunakan Fork!
phpCopy code$start_time = microtime(TRUE);
$results = \Spatie\Fork\Fork::new()->run(
function () {
return timeConsumingFunction();
},
function () {
return timeConsumingFunction();
},
function () {
return timeConsumingFunction();
}
);
echo "Result: " . array_sum($results);
$end_time = microtime(TRUE);
echo PHP_EOL . "Time: " . $end_time - $start_time;
Dalam contoh ini, kita menggunakan \Spatie\Fork\Fork yang memungkinkan kita membuat tiga tugas berbeda dan mengagregasi hasil dari masing-masing.
Mari kita lihat hasilnya:
shellCopy codeResult: 300000000
Time: 1.5
Seperti yang Anda lihat, kita telah mengurangi waktu dari 4,3 detik menjadi 1,5 detik 🎉
Apa yang Bisa Dilakukan Selanjutnya?
Saya sangat merekomendasikan untuk memeriksa halaman GitHub spatie/fork. Halaman ini memiliki instruksi yang jelas untuk para pengembang. Saya percaya ini adalah salah satu paket open-source hebat yang dibuat oleh Spatie.
Anda juga harus menonton video ini:
Artikel ini hanya merupakan pengantar sederhana untuk membahas konkurensi di PHP. Masih banyak hal bagus di internet yang saya rekomendasikan untuk dibaca jika Anda menyukai konsep ini.
Semoga harimu menyenangkan!