login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
marten
Moeilijkheidsgraad:
Normaal
Hits:
8610
Punten:
Aantal punten:
 (3.5)
Aantal stemmen:
6
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (5)
 

Tutorial:

Streaming in PHP

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!
 
pijl top
 

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.
 
pijl top
 

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
  • enz.

 
pijl top
 

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.
 
pijl top
 

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

/**
 * Aan te passen naar het eigen ip adres.
 **/
 
$socket stream_socket_server("tcp://0.0.0.0:1037");

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

/**
 * Aan te passen naar het eigen ip adres.
 **/
 
$socket stream_socket_client("tcp://0.0.0.0:1037");

while(!
feof($socket)) {
    echo 
fread($socket100);
}
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.
 
pijl top
 

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

/**
 * Aan te passen naar het eigen ip adres.
 **/
 
$socket stream_socket_server("tcp://0.0.0.0:1037");

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.
 
pijl top
 

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
 */

$sock fsockopen("ssl://secure.example.com"443$errno$errstr30);
if (!
$sock) die("$errstr ($errno) ");

$data "foo=" urlencode("Value for Foo") . "&bar=" urlencode("Value for Bar");

fwrite($sock"POST /form_action.php HTTP/1.0 ");
fwrite($sock"Host: secure.example.com ");
fwrite($sock"Content-type: application/x-www-form-urlencoded ");
fwrite($sock"Content-length: " strlen($data) . " ");
fwrite($sock"Accept: */* ");
fwrite($sock" ");
fwrite($sock"$data ");
fwrite($sock" ");

$headers "";
while (
$str trim(fgets($sock4096)))
  
$headers .= "$str ";

echo 
" ";

$body "";
while (!
feof($sock))
  
$body .= fgets($sock4096);

fclose($sock);
?> 


 
pijl top
 

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.
 
pijl top
 


« Vorige tutorial : Bestandssysteem Volgende tutorial : Nieuwsbriefsysteem »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.033s