prestasi


Symfony sangat pantas. Sudah tentu, jika anda benar-benar memerlukan kelajuan, terdapat banyak cara anda boleh menjadikan Symfony lebih pantas. Dalam bab ini, anda akan meneroka beberapa cara untuk mempercepatkan program Symfony anda.

Gunakan cache Kod Byte (seperti OPcache)

Perkara pertama yang perlu anda lakukan untuk meningkatkan prestasi ialah menggunakan "cache kod bait". Cache ini menyimpan fail PHP yang disusun untuk mengelak daripada menyusunnya semula pada setiap permintaan.

Terdapat banyak kod bait cache tersedia, sebahagian daripadanya adalah sumber terbuka. Mulai PHP 5.5, PHP mempunyai OPcache terbina dalam. Cache kod bait yang paling banyak digunakan dalam versi lama ialah APC.

Menggunakan cache kod bait mempunyai semua kelebihan dan tiada kelemahan, Symfony dibina untuk "berprestasi dengan sangat baik dalam persekitaran jenis ini".

Pantau perubahan fail sumber

Kebanyakan cache kod bait memantau perubahan fail sumber. Ini memastikan bahawa jika kod sumber fail berubah, kod bait akan disusun secara automatik. Ini sangat mudah, tetapi agak berlebihan.

Oleh itu, beberapa cache kod bait menyediakan pilihan untuk mematikan semakan ini. Contohnya, untuk mematikan semakan dalam APC, tambah apc.stat=0 terus pada fail konfigurasi php.ini anda. apc.stat=0 到你的 php.ini 配置文件中。

当关闭这些检查时,将由服务器管理员来负责“确保缓存在任何源文件发生改变时被清除”。否则,你的更新将不会在程序中被看到。

同理,byte code缓存必须在部署程序时被清除 (例如,使用APC时通过调用 apc_clear_cache() PHP函数,以及,使用Opcache时通过 opcache_reset())。

在PHP中,命令行以及web进程并不共享相同的OPcache。这意味着你不能通过执行终端中的某些命令来清除web服务器上的OPcache。你可以重启服务器或者通过web服务器调用 apc_clear_cache()opcache_reset()

Apabila semakan ini dimatikan, adalah menjadi tanggungjawab pentadbir pelayan untuk "memastikan cache dikosongkan apabila mana-mana fail sumber ditukar". Jika tidak, kemas kini anda tidak akan kelihatan dalam program.
Begitu juga, cache kod bait mesti dikosongkan semasa mengatur atur cara (contohnya, dengan memanggil fungsi PHP apc_clear_cache() apabila menggunakan APC dan dengan memanggil opcache_reset()). 🎜

Dalam PHP, baris arahan dan proses web tidak berkongsi OPcache yang sama. Ini bermakna anda tidak boleh mengosongkan OPcache pada pelayan web dengan melaksanakan arahan tertentu dalam terminal. Anda boleh memulakan semula pelayan atau memanggil fungsi apc_clear_cache() atau opcache_reset() melalui pelayan web (contohnya, apabila melaksanakan skrip web) mereka). 🎜🎜🎜

Optimumkan semua fail yang digunakan oleh Symfony

Secara lalai, OPcache PHP menyimpan 2000 fail dalam cache kod bait. Nombor ini masih terlalu kecil untuk aplikasi Symfony biasa, jadi anda mesti menetapkan pilihan konfigurasi opcache.max_accelerated_files kepada nilai yang lebih tinggi:

; php.iniopcache.max_accelerated_files = 20000

Konfigurasikan cache PHP realpath

PHP menggunakan hasil cache dalaman. memetakan "laluan fail kelas" kepada "laluan sebenar sistem fail". Ini meningkatkan prestasi program seperti Symfony yang membuka banyak fail PHP, terutamanya pada platform Windows.

Secara lalai, PHP menetapkan realpath_cache_size 16K, yang terlalu kecil untuk Symfony. Kemas kini nilai ini kepada sekurang-kurangnya 4096K. Selain itu, laluan cache hanya disimpan selama 120 saat secara lalai Juga pertimbangkan untuk mengemas kini nilai ini melalui pilihan realpath_cache_ttl: 16Krealpath_cache_size,这对Symfony来说实在太小。将这个值更新到至少 4096K。此外,缓存路径默认时只保存 120 秒,同样考虑通过 realpath_cache_ttl 选项来更新此值:

; php.ini
realpath_cache_size=4096K
realpath_cache_ttl=600

使用Composer的类映射功能 

默认时,Symfony标准版使用的是 autoload.php 文件中的Composer自动加载器(autoloader)。这个加载器很容易使用,因为它自动寻找任何“你在已注册目录中放置了”的新类。

不幸的是,这有使用成本,因为类加载器要遍历全部已配置的命名空间,以便找到一个特定文件,发起 file_exists() 的调用直到最终找到它想要的文件为止。

最简单的方案是告诉Composer构建一个优化过的"class map"(类映射),这是一个所有类所在位置的大数组,并且存放在 vendor/composer/autoload_classmap.php

1
<. h2> Gunakan fungsi pemetaan kelas Komposer

Secara lalai, versi standard Symfony menggunakan autoload.php

Autoloader komposer (autoloader) dalam fail. Pemuat ini mudah digunakan kerana ia secara automatik mencari mana-mana kelas baharu yang anda letakkan dalam direktori berdaftar.
Malangnya, ini memerlukan kos, kerana pemuat kelas perlu melintasi keseluruhan ruang nama yang dikonfigurasikan untuk mencari fail tertentu, membuat panggilan ke file_exists() sehingga akhirnya sehingga ia menemui fail yang dikehendakinya. Penyelesaian paling mudah ialah memberitahu Komposer untuk membina "peta kelas" yang dioptimumkan, yang merupakan susunan besar lokasi semua kelas dan disimpan dalam vendor/composer/autoload_classmap .php.
$  composer dump-autoload --optimize --no-dev --classmap-authoritative
Peta kelas ini boleh dijana daripada baris arahan dan mungkin menjadi sebahagian daripada proses penempatan anda.
🎜🎜
// app.php// ... 
use Symfony\Component\ClassLoader\ApcClassLoader; 
$loader = require __DIR__.'/../app/autoload.php';include_once __DIR__.'/../app/bootstrap.php.cache'; 
// Use APC for autoloading to improve performance
// Change 'sf2' by the prefix you want in order
// to prevent key conflict with another application
// 使用APC自动加载以提升性能,改变'sf2'为你希望的前缀,
// 以防止同其他程序发生key冲突$loader = new ApcClassLoader('sf2', $loader);$loader->register(true); 
// ...
🎜🎜🎜🎜🎜
  • --optimumkan
  • --optimize
  • 剥离你程序中的每一个兼容PSR-0 和 PSR-4 的类。
  • --no-dev
  • 排除那些你只在开发环境下使用的类(如tests)。
  • --classmap-authoritative
  • 防止Composer在文件系统中寻找那些没有出现在类映射中的类。

用APC缓存Autoloader 

另一个方案是在类被首次定位之再来缓存其位置。Symfony自带了一个类 - ApcClassLoader - 专门用来干这个。要使用它,只需适配你的前端控制器文件。如果你使用了标准版框架,可作出以下改变:

1

更多细节,参考 对Class Loader进行缓存 一文。

当使用APC autoloader时,如果你添加了新类,它们将被自动找到,所有东西的运作一如往常(即,并无必要“清除”缓存)。但是,如果你改变了某个特定命名空间或前缀的位置,你就需要flush你的APC缓存。否则,自动加载器仍将在那个命名空间的旧位置来寻找所有的类。

使用Bootstrap文件 

为确保弹性优化和代码复用,Symfony程序利用了多样化的类和第三方组件。但在每次请求中从分散位置加载全部这些类会导致一定程度的过载。为减轻负责,Symfony提供了一个脚本来生成一个被称为 bootstrap file 文件,考量的是在单一文件中加载多个类定义。通过包容这个文件 (它包含了各种核心类的拷贝),Symfony不再需要包容任何“含有那些类”的源文件。这将减少不少的硬盘吞吐(disc IO)。

如果你正在使用Symfony标准版,那你应该已经使用了这个bootstrap启动文件。为确保使用,打开你的前端控制器(通常是 app.phpBuang setiap kelas yang serasi dengan PSR-0 dan PSR-4 dalam program anda.

--no-dev
Kecualikan kelas yang anda hanya gunakan dalam persekitaran pembangunan (seperti ujian).
--classmap-authoritativeMenghalang Komposer daripada mencari kelas dalam sistem fail yang tidak muncul dalam peta kelas.

Gunakan APC untuk cache Autoloader

Penyelesaian lain ialah Cache lokasi kelas selepas ia pertama kali ditemui. Symfony disertakan dengan kelas - ApcClassLoader - khusus digunakan untuk melakukan ini. Untuk menggunakannya, hanya sesuaikan fail pengawal hadapan anda. Jika anda menggunakan versi standard rangka kerja, anda boleh membuat perubahan berikut:

include_once __DIR__.'/../var/bootstrap.php.cache';

Untuk butiran lanjut, rujuk Mengkonfigurasi Cache Pemuat KelasArtikel.

Apabila menggunakan autoloader APC, jika anda menambah kelas baharu, ia akan ditemui secara automatik, semuanya berfungsi sebagai biasa (iaitu, tidak perlu "mengosongkan" cache). Walau bagaimanapun, jika anda menukar lokasi ruang nama atau awalan tertentu, anda perlu mengepam cache APC anda. Jika tidak, autoloader masih akan mencari semua kelas di lokasi lama dalam ruang nama itu.

Jika anda menggunakan Symfony Standard Edition, anda sepatutnya menggunakan fail permulaan bootstrap ini. Untuk memastikan penggunaan, buka pengawal hadapan anda (biasanya app.php) dan pastikan baris kod berikut memang ada:

Gunakan fail Bootstrap

Untuk memastikan pengoptimuman yang fleksibel dan penggunaan semula kod, Symfony The program menggunakan pelbagai kelas dan komponen pihak ketiga. Tetapi memuatkan semua kelas ini dari lokasi yang berselerak pada setiap permintaan menghasilkan tahap beban yang tertentu. Untuk mengurangkan tanggungjawab, Symfony menyediakan skrip untuk menjana bootstrap yang dipanggil fail fail, mempertimbangkan memuatkan beberapa definisi kelas dalam satu fail. Dengan memasukkan fail ini (yang mengandungi salinan pelbagai kelas teras), Symfony tidak perlu lagi memasukkan sebarang fail sumber yang mengandungi kelas tersebut. Ini akan mengurangkan banyak pemprosesan cakera keras (cakera IO).

🎜rrreee🎜🎜🎜🎜rrreee🎜🎜🎜🎜 🎜🎜

Perhatikan bahawa terdapat dua kelemahan apabila menggunakan fail bootstrap:

  • Fail ini akan dijana semula apabila mana-mana sumber asal berubah ( Contohnya , apabila anda mengemas kini kod src Symfony atau pustaka kelas pihak ketiga vendor);
  • Apabila menyahpepijat, pembangun perlu menetapkan titik putus dalam fail bootstrap.

Jika anda menggunakan versi standard Symfony, fail permulaan akan dipasang secara automatik melalui perintah composer install selepas pustaka kelas vendor dikemas kini. Bina semula (Terjemahan: merujuk kepada skrip siaran dalam composer.json, dsb., yang juga boleh dilaksanakan secara manual) composer install 命令来自动重建(译注:指composer.json中的post脚本等,也可手动执行)

Bootstrap文件和Byte Code缓存 

即便使用了一种byte code缓存,在使用bootstrap文件时仍会提高性能,这是因为需要监控“发生改变”的文件变少了。当然这个功能如果在byte code cache中被关闭的话 (即在APC中设置 apc.stat=0

Fail Bootstrap dan cache Kod Byte

Walaupun cache kod bait digunakan, prestasi masih akan dipertingkatkan apabila menggunakan fail bootstrap kerana terdapat lebih sedikit fail yang perlu dipantau untuk "perubahan". Sudah tentu, jika fungsi ini dimatikan dalam cache kod bait (iaitu, menetapkan apc.stat=0 dalam APC), tiada sebab untuk menggunakan fail bootstrap .
#🎜🎜#