Inleiding De stream De File stream functies Netwerk Resources Uitgebreide Streaming Streaming Filters Voorbeeld Conclusie Inleiding
Streaming functies in PHP? What The..... !!?!?!?! Nooit van gehoord zegt u? De streaming en netwerk functies in PHP zijn
lang een ondergeschoven paardje geweest. Alhoewel ik durf te wedden dat iedere PHP programmeur stiekem er toch mee heeft
gewerkt! Ik niet zegt u? Nou wat dacht u van de functies als bijvoorbeeld include en fopen(). Deze gebruiken onder water
de stream technieken die PHP bevat! Er bestaan min of meer twee soorten streams. Je hebt de streams die standaard in PHP
zitten en de extra streams die je bovenop de bestaande kunt plaatsen. In deze korte inleiding hoop ik u een beetje warm
gemaakt te hebben voor deze tutorial!
De Stream
Zoals gezegd bestaan in PHP min of meer twee soorten streams. De 'standaard' streams zullen wel bekend zijn:
PHP.* --> De standaard PHP in- en output
FILE.* --> De standaard file access stream
HTTP.* --> Toegang tot resources door middel van HTTP
FTP.* --> Toegang tot resources door middel van FTP
compress.zlib.* --> Toegang tot gecomprimeerde data via de ZLIB Compression library
Bovenop de standaard stream functies zijn er nog de volgende die 'geinstalleerd' kunnen worden:
string.rot13 --> Encode de stream data door middel van de ROT13 techniek
string.toupper --> Maak de stream data uppercase
string.tolower --> Maak de stream data lowercase
string.strip_tags --> Strip de xml tags uit de stream data
convert.* --> Een familie functies die en- en decode dmv BASE64
mcrypt.* --> Een familie functies die meerdere algoritmes gebruikt bij het en- en decrypten
zlib.* --> Een familie functies die kan comprimeren en decomprimeren door middel van het ZLIB Compression library
Wat kan je hier nou mee doen? Je kan bijvoorbeeld met bovenstaande functies je eigen URI schema maken. Wat een URI schema is?
Een URI schema is de bovenste laag van een URI. Er zijn bijvoorbeeld de volgende URI schema's:
HTTP
HTTPS
FTP
mailto:
irc://
steam://
pop
enz.
Dat is dus wel handig om te weten dat dat ook met PHP kan. Met een zogenaamde WRAPPER kan je bepaalde
opties meegeven aan een stream. Bijvoorbeeld de HTTP wrapper vertelt hoe de url in de scheme moet worden omgezet naar een HTTP request.
In de Appendix M van de PHP manual (appendix) zijn de beschikbare wrappers samengevat. Meer informatie over URI schema's kan je hier
vinden.
De File stream functies
De file streamfuncties heeft SVM in zijn tutorial al grotendeels uitgelegd. De tutorial is hier te vinden.
Ik wil echter wel een kleine aanvulling doen op zijn tutorial. Met file_put_contents() kan je naast een string of een array ook een stream meegeven. Je kan dus files manipuleren hiermee.
Ook heb je bepaalde controle functies voor het werken met files. Bijvoorbeeld de volgende:
is_dir --> Controleer of het path een directory is
is_executable --> Controleer of het path een uitvoerbaar bestand is
is_file --> Controleer of het path bestaat en of het een file is
is_uploaded_file --> Controleer of het bestand is ge-upload via HTTP POST
Netwerk resources
De grote kracht van bovenstaande streamfuncties zal door het gebruik van die functies nog niet echt naar voren komen.
Maar de stream functies kunnen bijvoorbeeld ook gebruikt worden voor het benaderen van netwerk resources. Hierbij kan worden
gedacht aan bijvoorbeeld een netwerk van 2 computers maar het internet is ook een netwerk.
Een heel mooi voorbeeld is het uithalen van een leuke grap met uw statistieken script. We gaan onze HTTP stream zo aanpassen dat
het statistieken script een wel hele rare browser herkend. Deze grap halen we uit door middel van de functie stream_context_create().
We passen dus eerst onze HTTP stream aan en vervolgens bezoeken we de pagina door middel van file_get_contents(). Dit levert onderstaande
code op:
<?php
/**
* user_agent is makkelijk aan te passen naar je eigen tekst!
**/
$http_opties = stream_context_create(array('http' => array(
'user_agent' => "Sitemaster Tutorial Browser",
'max_redirects' => 3)
)
)
/**
* Eerste argument is de link. Hier kan je dus de pagina van je statistiekenscript neerzetten.
* Derde argument is onze opties :)
**/
$file = file_get_contents("http://localhost/", false, $http_opties);
?>
Zo is een statistieken script dus makkelijk te omzeilen met functies die gewoon in PHP bekend zijn! In het volgende paragraaf gaan we iets dieper in op de stream functies.
Uitgebreide Streaming
In de vorige paragraaf hebben we een simpel voorbeeldje gegeven over hoe een stream functie kan werken. Dit is een simpel
voorbeeldje evenals dat bijvoorbeeld het gebruik van fopen() of include() is. Wanneer we wat meer uitgebreide streaming nodig
zijn, door bijvoorbeeld een ander protocol of een eigen gemaakte programma, kunnen we een aantal functies gebruiken hiervoor.
Door middel van PHP kunnen we dus lezen en schrijven naar een bepaald protocol of eigen programma dat we bijvoorbeeld in c++
geschreven hebben. We behandelen eerst de code waarmee we schrijven.
<?php
while($conn = stream_socket_accept($socket)) {
fwrite($conn, "Dit is een boeiend voorbeeld
");
fclose($conn);
}
fclose($socket);
?>
Zoals je ziet werken we met de normale functies zoals fwrite() en fclose(). Maar houdt wel in uw achterhoofd dat dit ook streaming functies zijn!. We schrijven met
bovenstaande code een simpele tekst naar de server die we aangegeven hebben. Dit kan je gewoon als php code opslaan en uitvoeren.
Als we vervolgens kijken hoe we vervolgens weer kunnen uitlezen komen we weer de bekende functies tegen. Bekijk de volgende code maar eens:
<?php
while(!feof($socket)) {
echo fread($socket, 100);
}
fclose($socket);
?>
Sla het op als php script. Draai eerst het eerste script en vervolgens het tweede en de output zal zijn Dit is een boeiend voorbeeld.
Streaming Filters
Zoals al in de eerste paragraaf is aangegeven kan je bovenop de standaard functies een aantal andere functies plaatsen. Deze worden filters genoemd.
Je kan dus je data door verschillende filters halen. Bijvoorbeeld eerst alles uppercase met behulp van string.toupper en vervolgens meermalig encrypten met
mcrypt. Je kan zoveel filters uitvoeren als je wilt. Een bepaalde filter uitvoeren kan met behulp van de functie stream_filter_append().
Als we dus kijken naar ons vorig voorbeeld zou de code om het upper case op te slaan als volgt worden:
<?php
while($conn = stream_socket_accept($socket)) {
stream_filter_append($conn, 'string.toupper');
fwrite($conn, "Dit is een boeiend voorbeeld
");
fclose($conn);
}
fclose($socket);
?>
Zo kan je oneindig veel filters uitvoeren op je tekst.
Voorbeeld
Op php.net vond ik nog een mooi voorbeeld hoe je een https header kan generen door middel van PHP. hieronder volgt de code:
<?php
/* Send POST request to https://secure.example.com/form_action.php
* Include form elements named "foo" and "bar" with dummy values
*/
Conclusie
In bovenstaande tutorial is er dus deels dieper op de file stream functies in gegaan die SVM eerder behandelde. Maar er is ook een stuk nieuwe informatie voor veel van ons in verwerkt. De reactie in de eerste zin van de inleiding zegt genoeg over hoe ik eerst dacht over dit onderwerp. Maar nu ik het allemaal een beetje door heb zie ik in dat PHP meer kan dan we zelf weten.
Reacties en opmerkingen kunnen altijd geplaatst worden. Fanmail kan in mijn inbox :P.