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

性能

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

使用Byte Code緩存(如OPcache) ?

改善性能時(shí)你應(yīng)該做的第一件事是使用一種“byte code cache”。這些緩存存儲(chǔ)了編譯后的PHP文件以避免在每次請求時(shí)重復(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將被自動(dòng)編譯。這非常方便,但有些過載。

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

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

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

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

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

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

; php.iniopcache.max_accelerated_files = 20000

配置PHP realpath緩存 ?

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

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

; php.ini
realpath_cache_size=4096K
realpath_cache_ttl=600

使用Composer的類映射功能 ?

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

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

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

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

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

用APC緩存Autoloader ?

另一個(gè)方案是在類被首次定位之再來緩存其位置。Symfony自帶了一個(gè)類 - ApcClassLoader - 專門用來干這個(gè)。要使用它,只需適配你的前端控制器文件。如果你使用了標(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自動(dòng)加載以提升性能,改變'sf2'為你希望的前綴,
// 以防止同其他程序發(fā)生key沖突$loader = new ApcClassLoader('sf2', $loader);$loader->register(true); 
// ...

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

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

使用Bootstrap文件 ?

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

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

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

注意,當(dāng)使用bootstrap文件時(shí)有兩個(gè)不利點(diǎn):

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

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

Bootstrap文件和Byte Code緩存 ?

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