1. Functies met willekeurig aantal argumenten
Waarschijnlijk weet je al dat PHP kunt u functies te definiëren met optionele argumenten. Maar er is ook een werkwijze voor waarbij arbitrair aantal functieargumenten.
Ten eerste, hier is een voorbeeld met slechts optionele argumenten:
/ / Functie met 2 optionele argumenten function foo ($ arg1 ='', $ ARG2 ='') { echo "ARG1: $ arg1 \ n"; echo "ARG2: $ ARG2 \ n"; } foo ('hallo', 'wereld'); / * Prints: arg1: hello ARG2: world * / foo (); / * Prints: arg1: ARG2: * /
Nu, laten we eens kijken hoe we een functie die een aantal argumenten accepteert bouwen. Deze keer gaan we func_get_args () te gebruiken:
/ / Ja, kan de lijst met argumenten leeg zijn functie foo () { / / Geeft een array terug van alle argumenten dat wordt doorgegeven $ Args = func_get_args (); foreach ($ args als $ k => $ v) { echo "arg" ($ k +1) ": $ v \ n";.. } } foo (); / * Drukt niets af * / foo ('hallo'); / * Prints arg1: hello * / foo ('hallo', 'wereld', 'opnieuw'); / * Prints arg1: hello ARG2: world arg3: weer * /
2. Met behulp van Glob () om bestanden te zoeken
Veel PHP-functies hebben een lange en betekenisvolle naam. Toch kan het moeilijk zijn om te vertellen wat een functie met de naam glob () doet, tenzij je al bekend bent met die term van elders.
Zie het als een meer in staat versie van de scandir () functie. Het kan kunt u naar bestanden zoeken met behulp van patronen.
/ / Haal alle php-bestanden $ Files = glob ('* php.'); print_r ($ bestanden); / * Output er uit ziet: Reeks ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php ) * /
U kunt ophalen meerdere bestandstypen als volgt uit:
/ / Haal alle php-bestanden en TXT-bestanden $ Files = glob ('* {php, txt}.', GLOB_BRACE); print_r ($ bestanden); / * Output er uit ziet: Reeks ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5] => test.txt ) * /
Merk op dat de bestanden daadwerkelijk kan worden terug met een pad, afhankelijk van uw vraag:
$ Files = glob ('/ images / a * jpg...'); print_r ($ bestanden); / * Output er uit ziet: Reeks ( [0] => .. / images / apple.jpg [1] => .. / images / Art.jpg ) * /
Wilt u het volledige pad naar elk bestand te krijgen, kunt u gewoon bellen met de realpath () functie van de geretourneerde waarden:
$ Files = glob ('/ images / a * jpg...'); / / Geldt de functie op elk arrayelement $ files = array_map ('realpath', $ bestanden); print_r ($ bestanden); / * output ziet zoals: Array ([0] => C: \ wamp \ www \ images \ apple.jpg [1] => C: \ wamp \ www \ images \ Art.jpg) * / 3. Geheugengebruik informatie
Door het observeren van het geheugen gebruik van uw scripts, kunt u wellicht het optimaliseren van uw code beter.
PHP heeft een garbage collector en een mooi complex memory manager. De hoeveelheid geheugen wordt gebruikt door het script. kan gaan op en neer tijdens de uitvoering van een script. Om het huidige gebruik van het geheugen te krijgen, kunnen we de memory_get_usage () functie te gebruiken, en om het hoogste bedrag van het geheugen gebruikt worden op elk punt te krijgen, kunnen we gebruik maken van de memory_get_peak_usage () functie.
echo "De eerste:" memory_get_usage () "bytes \ n";.. / * Prints Eerste: 361400 bytes * / / / Laten we gebruik maken van wat geheugen for ($ i = 0; $ i <100000; $ i + +) { $ Array [] = md5 ($ i); } / / Laten we verwijderen de helft van de array for ($ i = 0; $ i <100000; $ i + +) { unset ($ array [$ i]); } echo "Finale:".. memory_get_usage () "bytes \ n"; / * Prints Finale: 885912 bytes * / echo "Peak:".. memory_get_peak_usage () "bytes \ n"; / * Prints Peak: 13687072 bytes * /
4. CPU-gebruik informatie
Hiervoor gaan we de getrusage () functie gebruiken. Houd er rekening mee dat dit niet beschikbaar is op Windows-platforms.
print_r (getrusage ()); / * Prints Reeks ( [Ru_oublock] => 0 [Ru_inblock] => 0 [Ru_msgsnd] => 2 [Ru_msgrcv] => 3 [Ru_maxrss] => 12692 [Ru_ixrss] => 764 [Ru_idrss] => 3864 [Ru_minflt] => 94 [Ru_majflt] => 0 [Ru_nsignals] => 1 [Ru_nvcsw] => 67 [Ru_nivcsw] => 4 [Ru_nswap] => 0 [Ru_utime.tv_usec] => 0 [Ru_utime.tv_sec] => 0 [Ru_stime.tv_usec] => 6269 [Ru_stime.tv_sec] => 0 ) * /
Dat ziet er een beetje cryptisch, tenzij je al een systeembeheer achtergrond. Hier is de uitleg van elke waarde (u hoeft niet om deze te onthouden):
ru_oublock: block uitvoerbewerkingen
ru_inblock: block ingang operaties
ru_msgsnd: verzonden berichten
ru_msgrcv: ontvangen berichten
ru_maxrss: maximale residente set
ru_ixrss: integraal gedeeld geheugen
ru_idrss: integraal ongedeelde gegevensgrootte
ru_minflt: pagina reclames
ru_majflt: pagina fouten
ru_nsignals: signalen ontvangen
ru_nvcsw: vrijwillige context switches
ru_nivcsw: onvrijwillige context switches
ru_nswap: swaps
ru_utime.tv_usec: bezoeker Tijd gebruikt (microseconden)
ru_utime.tv_sec: bezoeker Tijd gebruikt (seconden)
ru_stime.tv_usec: systeem tijd gebruikt (microseconden)
ru_stime.tv_sec: het systeem gebruikte tijd (seconden)
Om te zien hoeveel CPU kracht het script heeft verbruikt, moeten we kijken naar de 'gebruiker tijd' en 'systeem de tijd' waarden. De seconden en microseconden delen worden apart verzorgd door standaard. Je kunt de microseconden waarde met 1 miljoen, en voeg deze toe aan de seconden waarde, om de totale seconde als een decimaal getal te krijgen.
Laten we eens een voorbeeld:
/ / Slapen voor 3 seconden (niet-bezet) slapen (3); $ Data = getrusage (); echo "Gebruiker tijd:". ($ Data ['ru_utime.tv_sec'] + $ Data ['ru_utime.tv_usec'] / 1000000); echo "Systeem tijd:". ($ Data ['ru_stime.tv_sec'] + $ Data ['ru_stime.tv_usec'] / 1000000); / * Prints Gebruiker tijd: 0.011552 Systeem tijd: 0 * /
Hoewel het script duurde ongeveer 3 seconden te lopen, het CPU-gebruik was heel erg laag. Omdat tijdens de slaap de werking, het script is eigenlijk niet verbruikt CPU-bronnen. Er zijn vele andere taken die real-time kan nemen, maar mogen niet gebruik maken van CPU-tijd, zoals wachten op schijf is vereist. Dus zoals je ziet, het CPU-gebruik en de werkelijke lengte van de runtime zijn niet altijd hetzelfde.
Hier is een ander voorbeeld:
/ / Loop 10 miljoen keer (drukke) for ($ i = 0; $ i <10000000, $ i + +) { } $ Data = getrusage (); echo "Gebruiker tijd:". ($ Data ['ru_utime.tv_sec'] + $ Data ['ru_utime.tv_usec'] / 1000000); echo "Systeem tijd:". ($ Data ['ru_stime.tv_sec'] + $ Data ['ru_stime.tv_usec'] / 1000000); / * Prints Gebruiker tijd: 1.424592 Systeem tijd: 0.004204 * /
Dat duurde ongeveer 1,4 seconden CPU-tijd, die bijna allemaal was bezoeker Tijd, omdat er geen system calls.
Systeem Tijd is de hoeveelheid tijd die de CPU besteedt het uitvoeren van het systeem roept op tot de kernel ten behoeve van het programma. Hier is een voorbeeld van:
$ Start = microtime (true); / / Roept microtime te houden gedurende ongeveer 3 seconden while (microtime (true) - $ start <3) { } $ Data = getrusage (); echo "Gebruiker tijd:". ($ Data ['ru_utime.tv_sec'] + $ Data ['ru_utime.tv_usec'] / 1000000); echo "Systeem tijd:". ($ Data ['ru_stime.tv_sec'] + $ Data ['ru_stime.tv_usec'] / 1000000); / * Prints Gebruiker tijd: 1.088171 Systeem tijd: 1.675315 * /
Nu hebben we nogal wat van het systeem de tijd gebruik. Dit komt omdat de script wordt de microtime () functioneren vaak die een verzoek door het besturingssysteem te halen voert de tijd.
Ook u kunt merken dat de cijfers niet helemaal niet op tot 3 seconden. Dit komt omdat er waarschijnlijk andere processen op de server als goed, en het script is niet met 100% CPU voor de gehele duur van de 3 seconden.
5. Magic Constanten
PHP biedt nuttige magie constanten voor het ophalen van de huidige regel nummer (__LINE__), pad (__FILE__), pad (__DIR__), functie naam (__FUNCTION__), klasse naam (__CLASS__), methode naam (__METHOD__) en namespace (__NAMESPACE__).
We zijn niet van plan om elk van deze in dit artikel behandelen, maar ik zal u een paar use cases.
Wanneer rekening wordt andere scripts, is het een goed idee om gebruik maken van de __ directief ondersteund constante (of ook __ DIR__, vanaf PHP 5.3)
/ / Dit is ten opzichte van het pad van de geladen script / / Dit kan leiden tot problemen bij het uitvoeren van scripts uit verschillende mappen require_once ('config / database.php'); / / Dit is altijd in verhouding tot het pad van dit bestand / / Maakt niet uit waar het is opgenomen van require_once (dirname (__FILE__) '/ config / database.php'.);
Met behulp van __ LINE__ maakt debuggen makkelijker. U kunt het opsporen van de regelnummers:
/ / Wat code / / ... my_debug ("wat debug bericht", __ LINE__); / * Prints Regel 4: een aantal debug-bericht * / / / Wat meer code / / ... my_debug ("een andere debug bericht", __ LINE__); / * Prints Regel 11: een debug-bericht * / functie my_debug ($ msg, $ lijn) { echo "regel $ regel: $ msg \ n"; }
6. Het genereren van unieke ID's
Er kunnen zich situaties waar u een unieke combinatie te genereren. Ik heb veel mensen gebruik maken van de md5 () functie voor dit, hoewel het niet is precies bedoeld voor dit doel:
/ / Het genereren van unieke reeks echo md5 (time () rand (1,1000000).);
Er is eigenlijk een PHP functie genaamd uniqid () die is bedoeld gebruikt.
/ / Het genereren van unieke reeks echo uniqid (); / * Prints 4bd67c947233e * / / / Het genereren van een andere unieke reeks echo uniqid (); / * Prints 4bd67c9472340 * /
U zult merken dat, hoewel de snaren zijn uniek, ze lijken gelijk voor de eerste paar karakters. Dit komt omdat de gegenereerde reeks is gerelateerd aan de foutmelding. Dit heeft eigenlijk een prettig neveneffect, zoals elke nieuwe gegenereerde ID komt later in alfabetische volgorde, zodat ze kunnen worden gesorteerd.
Om de kans op het krijgen van een duplicaat te verminderen, kunt u langs een prefix, of de tweede parameter te verhogen entropie:
/ / Met prefix echo uniqid (foo_ '); / * Prints foo_4bd67d6cd8b8f * / / / Meer entropie echo uniqid ('', true); / * Prints 4bd67d6cd8b926.12135106 * / / / Beide echo uniqid ('bar_ ", true); / * Prints bar_4bd67da367b650.43684647 * /
Deze functie zal genereren kortere snaren dan md5 (), die ook bespaart u wat ruimte.
7. Serialisatie
Heb je ooit nodig om een complexe variabele op te slaan in een database of een tekstbestand? Je hoeft niet te komen met een mooie oplossing om uw arrays of objecten om te zetten in opgemaakte strings, zoals PHP al heeft functies voor dit doel.
Er zijn twee populaire methodes van serialisatiepakket variabelen. Hier is een voorbeeld dat de serialize () en unserialize () gebruikt:
/ / Een complexe serie $ Myvar = array ( 'Hallo', 42, array (1, 'twee'), 'Appel' ); / / Zetten in een reeks $ String = serialize ($ myvar); echo $ string; / * Prints a: 4: {i: 0; s: 5: "hello", ik: 1; i: 42, I: 2, a: 2: {i: 0; i: 1; i: 1; s: 3: "twee";} i: 3; s: 5: "appel";} * / / / Je kan de oorspronkelijke variabele $ Newvar = unserialize ($ string); print_r ($ newvar); / * Prints Reeks ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => twee ) [3] => Apple ) * /
Dit was de oorspronkelijke PHP serialisatie methode. Echter, omdat JSON is zo populair geworden in de afgelopen jaren, besloten ze om ondersteuning voor het toe te voegen in PHP 5.2. Nu kunt u gebruik maken van de json_encode () en json_decode () functies ook:
/ / Een complexe serie $ Myvar = array ( 'Hallo', 42, array (1, 'twee'), 'Appel' ); / / Zetten in een reeks $ String = json_encode ($ myvar); echo $ string; / * Prints ["Hallo", 42, [1, "twee"], "apple"] * / / / Je kan de oorspronkelijke variabele $ Newvar = json_decode ($ string); print_r ($ newvar); / * Prints Reeks ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => twee ) [3] => Apple ) * /
Het is compact en het beste van alles, compatibel met javascript en vele andere talen. Echter, voor complexe objecten, kunnen sommige gegevens verloren gaan.
8. Comprimeren Strings
Wanneer we spreken over compressie, denken we meestal over de bestanden, zoals ZIP-archieven. Het is mogelijk om lange slierten te comprimeren in PHP, zonder dat enige archiefbestanden.
In het volgende voorbeeld gaan we de gz Inpakken () en gzuncompress () functies gebruiken:
$ String = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut Elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui Pretium Orci, niet ultricies Elit Lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam Pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tijdelijk de luctus. Curabitur sed NIBH eu Elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam een nunc. In id magna pellentesque Tellus posuere adipiscing. Sed non mi metus, op lacinia augue. Sed magna NISI, ornare in mollis in, mollis sed nunc. Etiam op justo in leo congue mollis. Nullam in neque Eget metus hendrerit scelerisque eu niet Enim. Ut malesuada Lacus eu nulla Bibendum id euismod urna sodales. "; $ Gecomprimeerde = gz Inpakken ($ string); echo "Origineel formaat:". strlen ($ string) "\ n".; / * Prints Origineel formaat: 800 * / echo "Gecomprimeerde grootte:". strlen ($ gecomprimeerd) "\ n".; / * Prints Gecomprimeerde grootte: 418 * / / / Het krijgen van het weer $ Original = gzuncompress ($ gecomprimeerd);
We waren in staat om bijna 50% verkleinen diagram de. Ook de functies gzencode () en gzdecode () diagram de vergelijkbare resultaten, door een ander compressiealgoritme.
9. Registreer Shutdown-functie
Er is een functie genaamd register_shutdown_function (), die laat u met de rechtermuisknop uit te voeren een stuk code voor het script klaar is met draaien.
Stel je voor dat je wat benchmarken statistieken aan het einde van je script uitvoering, zoals hoe lang het duurde te lopen vast te leggen:
/ / Vangen de starttijd $ Start_time = microtime (true); / / Do some stuff / / ... / / Weer te geven hoe lang het script nam echo "uitvoering heeft:". (Microtime (true) - $ start_time). "Seconden.";
In eerste instantie lijkt misschien triviaal. Je voegt de code naar de bodem van het script en het loopt voordat het klaar is. Echter, als je ooit bellen met de exit () functie, zal die code nooit rennen. Ook als er een fatale fout, of als het script wordt beëindigd door de gebruiker (door op de Stop-knop in de browser), opnieuw het kan niet worden uitgevoerd.
Wanneer u register_shutdown_function () te gebruiken, zal uw code uit te voeren, ongeacht de reden waarom de script is gestopt:
$ Start_time = microtime (true); register_shutdown_function (my_shutdown '); / / Do some stuff / / ... functie my_shutdown () { global $ start_time; echo "uitvoering heeft:". (Microtime (true) - $ start_time). "Seconden."; }
