亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

性能

Symfony極其之快。當(dāng)然了,如果你真正需要速度,還有許多能讓你令Symfony變得更快的方法。本章,你將探索一些方法,來讓Symfony程序快上加快。

使用Byte Code緩存(如OPcache) ?

改善性能時你應(yīng)該做的第一件事是使用一種“byte code cache”。這些緩存存儲了編譯后的PHP文件以避免在每次請求時重復(fù)編譯它們。

有很多 byte code caches 可以利用,其中的一些還是開源的。截止到PHP 5.5, PHP內(nèi)置了  OPcache 。老版本中最廣泛使用的byte code cache是 APC。

使用byte code cache有百利而無一害,Symfony被打造成“可以在這種類型的環(huán)境中表現(xiàn)極佳”。

監(jiān)控源文件的改變 ?

多數(shù)byte code cache監(jiān)控著源文件的改變。這可確保如果文件源代碼發(fā)生改變,byte code將被自動編譯。這非常方便,但有些過載。

因此,一些byte code caches提供了一個選項來關(guān)閉這些檢查。例如,要在APC中關(guān)閉檢查,直接添加 apc.stat=0 到你的 php.ini 配置文件中。

當(dāng)關(guān)閉這些檢查時,將由服務(wù)器管理員來負(fù)責(zé)“確保緩存在任何源文件發(fā)生改變時被清除”。否則,你的更新將不會在程序中被看到。

同理,byte code緩存必須在部署程序時被清除 (例如,使用APC時通過調(diào)用 apc_clear_cache() PHP函數(shù),以及,使用Opcache時通過 opcache_reset())。

在PHP中,命令行以及web進(jìn)程并不共享相同的OPcache。這意味著你不能通過執(zhí)行終端中的某些命令來清除web服務(wù)器上的OPcache。你可以重啟服務(wù)器或者通過web服務(wù)器調(diào)用 apc_clear_cache()opcache_reset() 函數(shù)(如,在執(zhí)行web腳本時包容它們)。

優(yōu)化全部Symfony使用的文件 ?

默認(rèn)時,PHP的OPcache在byte code緩存中存了2000個文件。這個數(shù)字對于一般的Symfony程序來說還是太小,因此你必須設(shè)置 opcache.max_accelerated_files 配置選項為更高的值:

; php.iniopcache.max_accelerated_files = 20000

配置PHP realpath緩存 ?

PHP使用了一個內(nèi)部緩存來存儲“類文件路徑”映射到“文件系統(tǒng)真實路徑”的結(jié)果。這提高了Symfony這種“開啟許多PHP文件”的程序之性能,特別是在Windows平臺上。

默認(rèn)時PHP設(shè)置了一個 16Krealpath_cache_size,這對Symfony來說實在太小。將這個值更新到至少 4096K。此外,緩存路徑默認(rèn)時只保存 120 秒,同樣考慮通過 realpath_cache_ttl 選項來更新此值:

; php.ini
realpath_cache_size=4096K
realpath_cache_ttl=600

使用Composer的類映射功能 ?

默認(rèn)時,Symfony標(biāo)準(zhǔn)版使用的是 autoload.php 文件中的Composer自動加載器(autoloader)。這個加載器很容易使用,因為它自動尋找任何“你在已注冊目錄中放置了”的新類。

不幸的是,這有使用成本,因為類加載器要遍歷全部已配置的命名空間,以便找到一個特定文件,發(fā)起 file_exists() 的調(diào)用直到最終找到它想要的文件為止。

最簡單的方案是告訴Composer構(gòu)建一個優(yōu)化過的"class map"(類映射),這是一個所有類所在位置的大數(shù)組,并且存放在 vendor/composer/autoload_classmap.php 中。

這個類映射可以由命令行生成,可能會成為你部署過程的一部分。

1
$  composer dump-autoload --optimize --no-dev --classmap-authoritative
  • --optimize
  • 剝離你程序中的每一個兼容PSR-0 和 PSR-4 的類。
  • --no-dev
  • 排除那些你只在開發(fā)環(huán)境下使用的類(如tests)。
  • --classmap-authoritative
  • 防止Composer在文件系統(tǒng)中尋找那些沒有出現(xiàn)在類映射中的類。

用APC緩存Autoloader ?

另一個方案是在類被首次定位之再來緩存其位置。Symfony自帶了一個類 - ApcClassLoader - 專門用來干這個。要使用它,只需適配你的前端控制器文件。如果你使用了標(biāo)準(zhǔn)版框架,可作出以下改變:

// 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'為你希望的前綴,
// 以防止同其他程序發(fā)生key沖突$loader = new ApcClassLoader('sf2', $loader);$loader->register(true); 
// ...

更多細(xì)節(jié),參考 對Class Loader進(jìn)行緩存 一文。

當(dāng)使用APC autoloader時,如果你添加了新類,它們將被自動找到,所有東西的運作一如往常(即,并無必要“清除”緩存)。但是,如果你改變了某個特定命名空間或前綴的位置,你就需要flush你的APC緩存。否則,自動加載器仍將在那個命名空間的舊位置來尋找所有的類。

使用Bootstrap文件 ?

為確保彈性優(yōu)化和代碼復(fù)用,Symfony程序利用了多樣化的類和第三方組件。但在每次請求中從分散位置加載全部這些類會導(dǎo)致一定程度的過載。為減輕負(fù)責(zé),Symfony提供了一個腳本來生成一個被稱為 bootstrap file 文件,考量的是在單一文件中加載多個類定義。通過包容這個文件 (它包含了各種核心類的拷貝),Symfony不再需要包容任何“含有那些類”的源文件。這將減少不少的硬盤吞吐(disc IO)。

如果你正在使用Symfony標(biāo)準(zhǔn)版,那你應(yīng)該已經(jīng)使用了這個bootstrap啟動文件。為確保使用,打開你的前端控制器(通常是 app.php),然后檢查以下代碼行確實存在:

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

注意,當(dāng)使用bootstrap文件時有兩個不利點:

  • 此文件會在任意原始資源發(fā)生改變時重新生成 (如,當(dāng)你更新了Symfony的src代碼或vendor三方類庫時);
  • 調(diào)試時,開發(fā)者需要在bootstrap文件中設(shè)置斷點。

如果你使用的是Symfony標(biāo)準(zhǔn)版,啟動文件將在vendor類庫更新之后,透過 composer install 命令來自動重建(譯注:指composer.json中的post腳本等,也可手動執(zhí)行)

Bootstrap文件和Byte Code緩存 ?

即便使用了一種byte code緩存,在使用bootstrap文件時仍會提高性能,這是因為需要監(jiān)控“發(fā)生改變”的文件變少了。當(dāng)然這個功能如果在byte code cache中被關(guān)閉的話 (即在APC中設(shè)置 apc.stat=0),就再無理由使用bootstrap文件。