Rumah >pembangunan bahagian belakang >tutorial php >Menggunakan pemprosesan latar belakang untuk mempercepat masa beban halaman

Menggunakan pemprosesan latar belakang untuk mempercepat masa beban halaman

Jennifer Aniston
Jennifer Anistonasal
2025-02-08 09:26:11325semak imbas

Using Background Processing to Speed Up Page Load Times

mata teras

  • Pemprosesan latar belakang dengan ketara meningkatkan kelajuan pemuatan halaman: memindahkan tugas berat ke pemprosesan latar belakang, melepaskan sumber thread utama, dan memberi tumpuan kepada pemuatan halaman, dengan itu meningkatkan pengalaman melayari pengguna.
  • Dua komponen teras pemprosesan latar belakang: barisan tugas dan proses pekerja. Aplikasi ini mewujudkan tugas -tugas yang belum selesai, sementara pekerja memproses tugas mengekstrak satu persatu dari barisan untuk diproses. Proses pekerja berganda boleh diproses selari untuk mempercepatkan.
  • Pemilihan Stack Teknikal: Gunakan barisan tugas Beanstalkd untuk menyimpan tugas, komponen konsol Symfony untuk melaksanakan proses pekerja (sebagai perintah konsol), dan penyelia menguruskan proses pekerja.
  • Pengoptimuman Perpustakaan Imej: Elakkan penskalaan imej pada permintaan pertama (yang meningkatkan beban beban awal), tetapi sebaliknya menyebabkan lakaran kecil tidak segerak selepas galeri dibuat. Tugas ini boleh dipindahkan ke latar belakang untuk meningkatkan pengalaman pengguna dan skalabiliti.
  • Cabaran dan tanggapan yang berpotensi: Pastikan tugas -tugas itu berjaya diselesaikan dalam urutan yang betul dan kesilapan dalam tugas latar belakang dikendalikan dengan betul. Ini boleh dikurangkan dengan menggunakan beratur tugas dan pengendalian ralat yang teguh dan mekanisme pembalakan.
  • Artikel ini adalah sebahagian daripada siri artikel mengenai aplikasi sampel bangunan (blog multi-gambar) untuk penandaarasan dan pengoptimuman prestasi. (Lihat pangkalan kod di sini)

Dalam artikel sebelumnya, kami menambah ciri skala imej atas permintaan. Imej -imej berskala dan cache untuk kegunaan kemudian apabila diminta untuk kali pertama. Ini mudah, tetapi juga meningkatkan overhead pemuatan pertama;

Penyelesaian pengoptimuman adalah untuk menjadikan gambar kecil selepas membuat galeri. Anda mungkin berfikir, "Baiklah, tetapi ini akan menghalang pengguna yang mencipta galeri?" Pengguna akan dikelirukan tentang masa beban yang lebih lama, atau lebih teruk lagi, jika imej terlalu besar untuk diproses, anda akan menghadapi masa tamat dan/atau kesilapan. Penyelesaian terbaik adalah untuk menggerakkan tugas -tugas berat ini ke latar belakang.

Tugas latar belakang

Tugas latar adalah cara terbaik untuk mengendalikan sebarang tugas berat. Kami dapat dengan segera memberitahu pengguna bahawa kami telah menerima permintaan mereka dan mengatur pemprosesan. Begitu juga dengan YouTube untuk memuat naik video: Video tidak dapat diakses selepas dimuat naik. Pengguna perlu menunggu sehingga video diproses sepenuhnya sebelum pratonton atau perkongsian.

Pemprosesan atau menjana fail, menghantar e-mel, atau mana-mana tugas bukan kritikal lain harus dilakukan di latar belakang.

bagaimana untuk bekerja dalam pemprosesan backend

Kaedah pemprosesan latar belakang mempunyai dua komponen utama: barisan tugas dan proses pekerja. Aplikasi ini mewujudkan tugas yang perlu diproses, sementara pekerja menunggu dan mendapat satu tugas dari barisan pada satu masa.

Using Background Processing to Speed Up Page Load Times

Anda boleh membuat pelbagai proses pekerja (proses) untuk mempercepatkan pemprosesan, memecahkan tugas besar ke dalam ketulan yang lebih kecil dan memprosesnya secara serentak. Anda boleh menganjurkan dan menguruskan pemprosesan backend mengikut keperluan anda, tetapi sedar bahawa pemprosesan selari bukanlah tugas yang mudah: anda harus memberi perhatian kepada keadaan perlumbaan yang berpotensi dan mengendalikan tugas yang gagal dengan anggun.

Stack Teknologi Kami

Kami menggunakan barisan tugas Beanstalkd untuk menyimpan tugas -tugas, menggunakan komponen Konsol Symfony untuk melaksanakan proses pekerja sebagai arahan konsol, dan menggunakan penyelia untuk menguruskan proses pekerja.

Jika anda menggunakan Homestead bertambah baik, Beanstalkd dan penyelia dipasang, jadi anda boleh melangkaui arahan pemasangan di bawah.

instalkd

Beanstalkd adalah giliran pekerjaan yang cepat dengan antara muka yang sama yang pada asalnya direka untuk mengurangkan latensi dalam pelayaran halaman dalam aplikasi web trafik tinggi dengan menjalankan tugas-tugas yang memakan masa secara tidak sengaja.

Anda boleh menggunakan banyak perpustakaan pelanggan yang tersedia. Dalam projek kami, kami menggunakan PheAnstalk.

Untuk memasang Beanstalkd pada pelayan Ubuntu atau Debian anda, hanya jalankan

. Lihat halaman muat turun rasmi untuk mengetahui cara memasang Beanstalkd pada sistem operasi lain. sudo apt-get install beanstalkd

Selepas pemasangan, Beanstalkd bermula sebagai daemon, menunggu pelanggan menyambung dan membuat (atau memproses) pekerjaan:

<code>/etc/init.d/beanstalkd
Usage: /etc/init.d/beanstalkd {start|stop|force-stop|restart|force-reload|status}</code>
Pasang PheAnstalk sebagai kebergantungan dengan menjalankan

. composer require pda/pheanstalk

barisan akan digunakan untuk membuat dan mengambil pekerjaan, jadi kami memusatkan penciptaan pekerjaan dalam satu perkhidmatan kilang:

JobQueueFactory

Sekarang, kita boleh menyuntik perkhidmatan kilang seperti yang diperlukan untuk berinteraksi dengan Beanstalkd Baris. Kami mentakrifkan nama giliran sebagai tetap dan merujuknya apabila meletakkan pekerjaan ke dalam barisan atau memantau barisan dalam proses pekerja.
<code class="language-php"><?php
namespace App\Service;

use Pheanstalk\Pheanstalk;

class JobQueueFactory
{
    private $host = 'localhost';
    private $port = '11300';

    const QUEUE_IMAGE_RESIZE = 'resize';

    public function createQueue(): Pheanstalk
    {
        return new Pheanstalk($this->host, $this->port);
    }
}</code>

Pemasangan Penyelia

Menurut halaman rasmi, Penyelia adalah sistem klien/pelayan yang membolehkan penggunanya memantau dan mengawal banyak proses pada sistem operasi UNIX.

Kami akan menggunakannya untuk memulakan, memulakan semula, mengembangkan dan memantau proses pekerja.

Pasang Penyelia pada pelayan Ubuntu/Debian anda dengan menjalankan

. Selepas pemasangan, penyelia akan berjalan di latar belakang sebagai daemon. Gunakan

untuk mengawal proses penyelia: sudo apt-get install supervisor supervisorctl

Untuk menggunakan penyelia untuk mengawal proses, kita perlu menulis fail konfigurasi dan menerangkan bagaimana kita mahu mengawal proses kita. Konfigurasi disimpan dalam
<code>$ sudo supervisorctl help

default commands (type help <topic>):
</topic>=====================================
add    exit      open  reload  restart   start   tail
avail  fg        pid   remove  shutdown  status  update
clear  maintail  quit  reread  signal    stop    version</code>
. Konfigurasi penyelia mudah untuk mengubah saiz proses pekerja adalah seperti berikut:

/etc/supervisor/conf.d/

Kami memberitahu Penyelia bagaimana untuk menamakan proses yang dihasilkan, jalan ke perintah yang akan dijalankan, prosesnya secara automatik dimulakan dan dimulakan semula, berapa banyak proses yang kami inginkan, dan di mana untuk merakam output. Ketahui lebih lanjut mengenai konfigurasi penyelia di sini.
<code>[program:resize-worker]
process_name=%(program_name)s_%(process_num)02d
command=php PATH-TO-YOUR-APP/bin/console app:resize-image-worker
autostart=true
autorestart=true
numprocs=5
stderr_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stderr.log
stdout_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stdout.log</code>

Saiz semula imej di latar belakang

Setelah infrastruktur kami ditubuhkan (iaitu, Beanstalkd dan penyelia dipasang), kami dapat mengubahsuai permohonan kami untuk mengubah saiz imej di latar belakang selepas membuat galeri. Untuk melakukan ini, kita perlukan:

  • Kemas kini logik perkhidmatan imej dalam ImageController
  • melaksanakan proses pekerja saiz sebagai perintah konsol
  • Buat konfigurasi penyelia untuk proses pekerja kami
  • Kemas kini peranti dan ubah saiz imej dalam kelas peranti.

Kemas kini logik perkhidmatan gambar

Setakat ini, kami telah mengubah saiz imej pada permintaan pertama: Jika fail imej yang diminta tidak wujud, ia akan dibuat secara dinamik.

ImageController Kami sekarang akan mengubah suai

untuk mengembalikan respons imej yang diminta hanya jika fail imej saiznya wujud (iaitu imej telah diubahsuai).

Jika tidak wujud, permohonan itu akan mengembalikan tindak balas imej pemegang tempat yang sama yang menunjukkan bahawa imej itu diubahsuai. Ambil perhatian bahawa tindak balas imej letak mempunyai tajuk kawalan cache yang berbeza kerana kami tidak mahu menyingkirkan imej pemegang tempat;

GalleryCreatedEvent kami akan membuat acara mudah yang dipanggil UploadController dengan muatan sebagai ID galeri. Selepas galeri berjaya dibuat, acara ini akan dihantar dalam

:
<code>/etc/init.d/beanstalkd
Usage: /etc/init.d/beanstalkd {start|stop|force-stop|restart|force-reload|status}</code>

Di samping itu, kami akan mengemas kini mesej Flash menggunakan "imej kini sedang diproses." supaya pengguna tahu bahawa kita perlu melakukan pemprosesan pada imej mereka sebelum kita siap.

kami akan membuat pelanggan acara GalleryEventSubscriber, yang akan bertindak balas terhadap GalleryCreatedEvent dan meminta saiz semula pekerjaan untuk setiap imej di galeri yang baru dibuat:

<code class="language-php"><?php
namespace App\Service;

use Pheanstalk\Pheanstalk;

class JobQueueFactory
{
    private $host = 'localhost';
    private $port = '11300';

    const QUEUE_IMAGE_RESIZE = 'resize';

    public function createQueue(): Pheanstalk
    {
        return new Pheanstalk($this->host, $this->port);
    }
}</code>

Sekarang, apabila pengguna berjaya mencipta galeri, aplikasi itu akan menjadikan halaman galeri, tetapi gambar kecil beberapa imej masih belum siap, jadi mereka tidak akan dipaparkan:

Using Background Processing to Speed Up Page Load Times

Setelah proses pekerja selesai saiz semula, halaman galeri lengkap harus diberikan penyegaran seterusnya.

Melaksanakan proses pekerja saiz sebagai perintah konsol

Proses pekerja adalah proses mudah yang melakukan pekerjaan yang sama untuk setiap pekerjaan yang diambil dari barisan. Pelaksanaan proses pekerja disekat pada panggilan

sehingga pekerja menyimpan pekerjaan, atau waktu tamat. $queue->reserve()

Hanya satu proses pekerja yang dapat memperoleh dan memproses pekerjaan. Pekerjaan biasanya mengandungi muatan, seperti rentetan atau susunan/objek bersiri. Dalam contoh kami, ia akan menjadi uuid galeri yang dicipta.

pekerja mudah kelihatan seperti ini:

<code>/etc/init.d/beanstalkd
Usage: /etc/init.d/beanstalkd {start|stop|force-stop|restart|force-reload|status}</code>

anda mungkin menyedari bahawa proses pekerja akan keluar selepas waktu tamat atau selepas pekerjaan diproses. Kami boleh membungkus logik proses pekerja dalam gelung tak terhingga dan menjadikannya mengulangi pekerjaannya selama -lamanya, tetapi ini boleh menyebabkan masalah seperti tamat masa sambungan pangkalan data selepas tidak aktif dan membuat penempatan lebih sukar. Untuk mengelakkan ini, kitaran hayat proses pekerja kami akan berakhir selepas satu tugas selesai. Penyelia kemudian memulakan semula proses pekerja sebagai proses baru.

Lihat ResizeImageWorkerCommand untuk memahami struktur perintah pekerja. Proses kerja yang dilaksanakan dengan cara ini juga boleh dimulakan secara manual sebagai perintah konsol Symfony: ./bin/console app:resize-image-worker.

Buat konfigurasi penyelia

Kami mahu proses pekerja kami bermula secara automatik, jadi kami akan menetapkan arahan autostart=true dalam konfigurasi. Oleh kerana proses pekerja mesti dimulakan semula selepas pemprosesan tugas masa tamat atau berjaya, kami juga akan menetapkan arahan autorestart=true.

Bahagian terbaik pemprosesan backend adalah kemudahan pemprosesan selari. Kami boleh menetapkan arahan numprocs=5, dan penyelia akan menjana lima contoh proses pekerja. Mereka akan menunggu pekerjaan dan memprosesnya secara bebas, membolehkan kita dengan mudah skala sistem. Apabila sistem berkembang, anda mungkin perlu meningkatkan bilangan proses. Oleh kerana kita akan mempunyai pelbagai proses yang berjalan, kita perlu menentukan struktur nama proses, jadi kita menetapkan arahan process_name=%(program_name)s_%(process_num)02d.

Terakhir tetapi tidak kurang, kami ingin menyimpan output proses pekerja supaya mereka dapat dianalisis dan debug apabila masalah timbul. Kami akan menentukan jalan stderr_logfile dan stdout_logfile.

konfigurasi penyelia penuh untuk proses saiz semula pekerja kami adalah seperti berikut:

<code class="language-php"><?php
namespace App\Service;

use Pheanstalk\Pheanstalk;

class JobQueueFactory
{
    private $host = 'localhost';
    private $port = '11300';

    const QUEUE_IMAGE_RESIZE = 'resize';

    public function createQueue(): Pheanstalk
    {
        return new Pheanstalk($this->host, $this->port);
    }
}</code>

Selepas membuat (atau mengemas kini) fail konfigurasi yang terletak di direktori /etc/supervisor/conf.d/, anda mesti memberitahu penyelia untuk membaca semula dan mengemas kini konfigurasinya dengan melaksanakan perintah berikut:

<code>$ sudo supervisorctl help

default commands (type help <topic>):
</topic>=====================================
add    exit      open  reload  restart   start   tail
avail  fg        pid   remove  shutdown  status  update
clear  maintail  quit  reread  signal    stop    version</code>

Jika anda menggunakan Homestead bertambah baik (anda harus menggunakan!), Anda boleh menggunakan scripts/setup-supervisor.sh untuk menghasilkan konfigurasi penyelia untuk projek: sudo ./scripts/setup-supervisor.sh.

Kemas kini peranti

Gambar kecil imej tidak lagi akan diberikan pada permintaan pertama, jadi apabila kita memuatkan peranti dalam kelas peranti LoadGalleriesData, kita perlu meminta secara eksplisit untuk setiap imej:

<code>[program:resize-worker]
process_name=%(program_name)s_%(process_num)02d
command=php PATH-TO-YOUR-APP/bin/console app:resize-image-worker
autostart=true
autorestart=true
numprocs=5
stderr_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stderr.log
stdout_logfile = PATH-TO-YOUR-APP/var/log/resize-worker-stdout.log</code>

Sekarang anda harus merasakan peranti memuat lebih perlahan, itulah sebabnya kami memindahkannya ke latar belakang dan bukan memaksa pengguna untuk menunggu ia selesai!

Petua dan Petua

Proses pekerja berjalan di latar belakang, jadi walaupun anda menggunakan versi baru aplikasi, anda masih akan mempunyai proses pekerja yang sudah lapuk sebelum memulakan semula pertama.

Dalam kes kami, kami perlu menunggu semua proses pekerja untuk menyelesaikan tugas atau masa mereka (5 minit) sehingga kami yakin bahawa semua proses pekerja telah dikemas kini. Ketahui ini apabila membuat proses penempatan!

Soalan Lazim Menggunakan Pemprosesan Latar Belakang Untuk Mempercepat Masa Memuat Halaman (FAQ)

Peranan apakah pemprosesan latar belakang bermain dalam mempercepatkan memuatkan halaman?

Pemprosesan latar belakang memainkan peranan penting dalam meningkatkan kelajuan pemuatan halaman. Ia membolehkan tugas -tugas tertentu dilakukan di latar belakang, dengan itu membebaskan sumber benang utama dan memberi tumpuan kepada pemuatan halaman. Ini bermakna pengguna tidak perlu menunggu tugas -tugas ini selesai untuk memuatkan halaman, menghasilkan pengalaman melayari yang lebih cepat dan lancar.

Bagaimana komponen proses Symfony membantu dalam pemprosesan latar belakang?

Komponen Proses Symfony adalah alat yang berkuasa yang membolehkan anda melaksanakan arahan dalam proses kanak -kanak. Ia menyediakan API berorientasikan objek mudah untuk menjalankan arahan sistem dan menguruskan outputnya. Ini amat berguna untuk pemprosesan latar belakang, kerana ia membolehkan anda menjalankan tugas dalam proses berasingan tanpa menyekat benang utama.

Apakah beberapa kes penggunaan biasa untuk pemprosesan backend?

Pemprosesan latar belakang biasanya digunakan dalam situasi di mana tugas boleh dilaksanakan tanpa mengambil kira benang utama. Ini termasuk tugas -tugas seperti menghantar e -mel, memproses gambar, pengiraan yang kompleks, dan banyak lagi. Dengan menjalankan tugas -tugas ini di latar belakang, anda boleh meningkatkan prestasi aplikasi anda dan memberikan pengalaman pengguna yang lebih baik.

Bagaimana untuk melaksanakan proses latar belakang dalam PHP?

Fungsi

boleh digunakan untuk melaksanakan proses latar belakang dalam PHP. Fungsi ini membolehkan anda menjalankan arahan dalam proses kanak -kanak dan kemudian terus melaksanakan skrip yang lain tanpa menunggu arahan selesai. Berikut adalah contoh mudah: exec()

exec("php background_task.php > /dev/null &"); Dalam contoh ini,

adalah skrip yang anda mahu jalankan di latar belakang.

background_task.php

Apakah komponen messenger Symfony dan apakah yang perlu dilakukan dengan pemprosesan latar belakang?

Komponen Messenger Symfony adalah sistem bas mesej yang boleh digunakan untuk menghantar mesej secara tidak segerak kepada pengendali. Ini bermakna anda boleh menghantar mesej ke bas dan kemudian terus melaksanakan skrip tanpa menunggu mesej diproses. Ini adalah satu bentuk pemprosesan latar belakang, kerana pemprosesan mesej dapat dilakukan dalam proses yang berasingan.

Bagaimana menggunakan pemprosesan backend untuk meningkatkan prestasi laman web anda?

Dengan memunggah tugas ke latar belakang, anda boleh membebaskan sumber thread utama dan fokus pada memuatkan halaman. Ini dapat meningkatkan prestasi laman web anda dengan ketara, terutamanya jika anda mempunyai tugas yang memakan masa atau sumber yang intensif. Beberapa tugas biasa yang boleh dibebaskan ke latar belakang termasuk menghantar e -mel, memproses gambar, dan menjalankan pengiraan yang kompleks.

Apakah cabaran potensi pemprosesan backend dan bagaimana untuk mengurangkan cabaran -cabaran ini?

Salah satu cabaran utama pemprosesan backend adalah untuk memastikan tugas -tugas itu berjaya dan siap mengikut urutan yang betul. Ini boleh dikurangkan dengan menggunakan giliran tugas, yang memastikan tugas -tugas itu dilaksanakan mengikut urutan yang ditambah. Cabaran lain ialah mengendalikan kesilapan dalam tugas latar belakang. Ini dapat diselesaikan dengan melaksanakan mekanisme pengendalian ralat dan pembalakan yang mantap.

Bolehkah pemprosesan latar belakang digunakan dalam kombinasi dengan teknik pengoptimuman prestasi lain?

Ya, pemprosesan latar belakang boleh digunakan bersamaan dengan teknik pengoptimuman prestasi lain. Sebagai contoh, anda boleh menggunakan cache untuk menyimpan hasil operasi mahal dan kemudian menggunakan pemprosesan latar belakang untuk mengemas kini cache secara berkala. Ini membolehkan anda menyediakan data terkini tanpa melambatkan aplikasi.

Bagaimana untuk memantau kemajuan tugas latar belakang?

Pelbagai alat dan teknik boleh digunakan untuk memantau kemajuan tugas backend. Pendekatan yang sama adalah menggunakan pembalakan untuk merakam status setiap tugas. Anda juga boleh menggunakan alat seperti Komponen Messenger Symfony, yang menyediakan sokongan terbina dalam untuk memantau dan menyahpepijat tugas backend.

Adakah terdapat langkah berjaga -jaga keselamatan semasa menggunakan pemprosesan latar belakang?

Ya, terdapat beberapa langkah berjaga -jaga keselamatan apabila menggunakan pemprosesan latar belakang. Sebagai contoh, anda perlu memastikan bahawa tugas latar belakang tidak membocorkan maklumat sensitif dan tidak tertakluk kepada serangan suntikan. Anda juga harus memastikan tugas anda berjalan dalam persekitaran yang selamat dan mereka tidak mempunyai lebih banyak kebenaran daripada yang mereka perlukan untuk melakukan tugas mereka.

Atas ialah kandungan terperinci Menggunakan pemprosesan latar belakang untuk mempercepat masa beban halaman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn