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()
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
: 16K
的 realpath_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.file_exists()
sehingga akhirnya sehingga ia menemui fail yang dikehendakinya. 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
- 剥离你程序中的每一个兼容PSR-0 和 PSR-4 的类。
--no-dev
- 排除那些你只在开发环境下使用的类(如tests)。
--classmap-authoritative
- 防止Composer在文件系统中寻找那些没有出现在类映射中的类。
--optimize
用APC缓存Autoloader ¶
另一个方案是在类被首次定位之再来缓存其位置。Symfony自带了一个类 - ApcClassLoader
- 专门用来干这个。要使用它,只需适配你的前端控制器文件。如果你使用了标准版框架,可作出以下改变:
1
更多细节,参考 对Class Loader进行缓存 一文。
当使用APC autoloader时,如果你添加了新类,它们将被自动找到,所有东西的运作一如往常(即,并无必要“清除”缓存)。但是,如果你改变了某个特定命名空间或前缀的位置,你就需要flush你的APC缓存。否则,自动加载器仍将在那个命名空间的旧位置来寻找所有的类。
使用Bootstrap文件 ¶
为确保弹性优化和代码复用,Symfony程序利用了多样化的类和第三方组件。但在每次请求中从分散位置加载全部这些类会导致一定程度的过载。为减轻负责,Symfony提供了一个脚本来生成一个被称为 bootstrap file 文件,考量的是在单一文件中加载多个类定义。通过包容这个文件 (它包含了各种核心类的拷贝),Symfony不再需要包容任何“含有那些类”的源文件。这将减少不少的硬盘吞吐(disc IO)。
如果你正在使用Symfony标准版,那你应该已经使用了这个bootstrap启动文件。为确保使用,打开你的前端控制器(通常是 app.php
Buang setiap kelas yang serasi dengan PSR-0 dan PSR-4 dalam program anda.
--no-dev
--classmap-authoritative
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 a> 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). |
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, menetapkanapc.stat=0
dalam APC), tiada sebab untuk menggunakan fail bootstrap .