PHP: require vs require_once
Tad nu, lūk, esot pamanīts, ka require_once ir līdz pat 4 reizēm lēnāks nekā require. Googlē atrodami dažādi skaitļi un mērījumi, dažkārt arī pretrunīgi. Vairākkārtēja faila iekļaušana pati par sevi nav laba, jo fails tiek nolasīts un tur esošais kods analizēts un izpildīts.
Domājams, agri vai vēlu veidojot PHP programmiņas rodas vēlme daļu koda glabāt citā failā. Šādā veidā rodas gan koda pārskatāmība, gan loģisko struktūra. Labs jautājums cik smalki sadalīt. Un šeit viennozīmīgas atbildes nav.
include(„file.php”) – php komanda, kas iekļauj failu file.php. Tas nozīmē, ja failā file.php glabāsies funkcija x(), tā būs pieejama un izmantojama pēc šīs komandas izpildes. Ja fails file.php nav atrasts, tik parādīts warning tipa brīdinājums, savukārt, ja šādā gadījumā nepieciešams „lai pasaule apstājas” lietojam require.
Jo sarežģītāks kods, jo lielāka varbūtība, ka esošās funkcijas būs atkarīga no citām funkcijām, kuras visticamāk glabāsies citos failos. Šādiem gadījumiem, php izdomājuši funkciju include_once(„file.php”).
function A() { return 123; } require_once("fails_A.php") function B() { return A(); }
Tad nu, lūk, esot pamanīts, ka require_once ir līdz pat 4 reizēm lēnāks nekā require. Googlē atrodami dažādi skaitļi un mērījumi, dažkārt arī pretrunīgi. Vairākkārtēja faila iekļaušana pati par sevi nav laba, jo fails tiek nolasīts un tur esošais kods analizēts un izpildīts.
http://lv.php.net/manual/en/function.require-once.php#62838
http://peter.mapledesign.co.uk/weblog/archives/writing-faster-php-code-1-require_once
Gan vienu gan otru procesu var paātrināt, ja izmanto absolūto nevis relatīvo adresi. T.i. require(„/var/www/user1/file1.php”) nevis require(„../../file.php”); Nelielos projektiņos atšķirību var arī nepamanīt, jo izrādās relatīvās adreses kešojas:
http://us2.php.net/manual/en/ini.core.php#ini.realpath-cache-size
Alternatīvas?
1. izmantot include (vai require) tikai vienreiz;
2. __autoload() funkcijas izmantošana;
3. class_exists('myClass') || require('path/to/myClass.class.php');
4. function_exists(’functionInFile’) && return; vai class_exists(’ClassInFile’) && return;
5. @include(“file.php”);
Pēdējais – kļūdas apspiešana (error suppression), kā zināms, ir salīdzinoši laikietilpīgs process, bet par to kādā citā rakstā :)
http://www.techyouruniverse.com/software/php-performance-tip-require-versus-require_once
P.S. Es pieminēju, ka statiskās metodes izsaukšana ir ātrāka?
PHP include ir atšķirīga no include, ko lieto C++ vai importa, ko lieto Java. Atšķirība ir tanī apstāklī, ka iepriekš minētajās valodās norāde uz papildus bibliotēkām, bet PHP tiek iekļauts un izpildīts kods.
Līdz ar ko PHP include_once attāli līdzīgs C++ izmantotajam include.
Zināms, ka require_once nemīl arī acceleratori (evil)
Tās alternatīvas īstenība pat būs laikietilpīgākas (it īpaši __autoload) nekā vienkārši *_once izmantošana.
Un piektā alternatīva patiešām būs ļoti slikta prakse, imo.