Ionut Stoica

Programator PHP / Frontend developer / Pasionat de Electronica Auto
9Apr

Crearea unui Daemon in PHP – Partea 2

[ad]
Okey, in prima parte a acestui articol am descris fiecare functie legata de socket pe care o vom folosi in tutorial.
Avand in vedere ca este un script PHP, vom incepe scriptul cu tag-ul de deschidere <?php si set_time_limit(0), deoarece Daemon-ul, prin menirea sa, trebuie sa ruleze fara oprire.

In acest tutorial voi prezenta crearea unui Daemon care trimite un mesaj de intampinare la accesare si calculeaza suma a 2 numere dupa care deconecteaza clientul.
Variabilele folosite in script:
$Socket – Resursa SOCKET;
$IP – IP-ul host (cel care accepta conexiuni);
$Port – Port pe care se accepta conexiunile;
$Conexiune – Conexiune acceptata cu functia socket_accept;
$Date – Date trimise/primite spre/de la client;
$Intampinare – Mesaj de intampinare client;

[ad]

Sa incepem cu inceputul… avem resursa Socket initializata ca AF_INET, SOCK_STREAM (Conexiune de tip IPv4/TCP) ce accepta conexiuni nelimitate pe ip-ul 127.0.0.1 (localhost), port 4444.
Pana aici avem urmatorul script:

<?
set_time_limit(0);

$IP = ‘127.0.0.1’;
$Port = ‘4444’;
$Intampinare = “Salut, acesta este un exemplu de calculator (a+b).\n”;

$Socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($Socket, $IP, $Port);
socket_listen($Socket, 0);
$Conexiune = socket_accept($Socket);
?>

Pentru a rula continuu, partea cu socket_accept trebuie sa ruleze intr-o bucla de tip WHILE in care sa execute operatiile.
Se ajunge la urmatorul script:

<?
set_time_limit(0);

$IP = ‘127.0.0.1’;
$Port = ‘4444’;
$Intampinare = “Salut, acesta este un exemplu de calculator (a+b).\n”;

$Socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($Socket, $IP, $Port);
socket_listen($Socket, 0);

while($Conexiune = socket_accept($Socket)){

}
?>

Acum, in interiorul buclei WHILE putem sa citim si sa scriem catre un client.
In primul rand ii transmitem clientului proaspat conectat mesajul de intampinare:

socket_write($Conexiune, $Intampinare, strlen ($Intampinare));

dupa care afisam textul “a =” pentru a sti clientul ce are de facut si imediat dupa aceea citim ce introduce clientul de la tastatura. Aceasta operatie se face de 2 ori (o data pentru “a”, apoi pentru “b”). Deoarece utilizatorul poate introduce si altceva decat valori numerice, se pune conditia de float pentru ce se citeste de la tastatura.
Dupa realizarea operatiei de adunare se afiseaza rezultatul alaturi de mesajul de adio si se inchide conexiunea catre client

$Date     = “a = “;
socket_write($Conexiune, $Date, strlen ($Date));
$Date     = socket_read($Conexiune, 1024);
$a         = (float) $Date;

$Date     = “b = “;
socket_write($Conexiune, $Date, strlen ($Date));
$Date     = socket_read($Conexiune, 1024);
$b        = (float) $Date;

$c        = $a + $b;

$Date = “Rezultatul adunarii $a + $b este $c\nBye Bye\n”;
socket_write($Conexiune, $Date, strlen ($Date));
socket_close($Conexiune);

Asadar, scriptul complet este urmatorul:

<?
set_time_limit(0);

$IP = '127.0.0.1';
$Port = '4444';
$Intampinare = "Salut, acesta este un exemplu de calculator (a+b).\n";

$Socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($Socket, $IP, $Port);
socket_listen($Socket, 0);

  while($Conexiune = socket_accept($Socket)){
	socket_write($Conexiune, $Intampinare, strlen ($Intampinare));

	$Date 	= "a = ";
	socket_write($Conexiune, $Date, strlen ($Date));
	$Date 	= socket_read($Conexiune, 1024);
	$a 	= (float) $Date;

	$Date 	= "b = ";
	socket_write($Conexiune, $Date, strlen ($Date));
	$Date 	= socket_read($Conexiune, 1024);
	$b	= (float) $Date;

	$c	= $a + $b;

	$Date = "Rezultatul adunarii $a + $b este $c\nBye Bye\n";
	socket_write($Conexiune, $Date, strlen ($Date));
	socket_close($Conexiune);
  }
socket_close($Socket);
?>

Orice fel de sugestii pentru imbunatatirea calitatii acestui website sunt binevenite

Comments(3)
  • Dani
    May 26, 2009 at 7:51 pm,  Reply

    Salut, am incercat sa rulez scriptul tau si primesc o eroare in genul

    Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: Only one usage of each socket address (protocol/network address/port) is normally permitted. in

    Warning: socket_listen() [function.socket-listen]: unable to listen on socket [0]: An invalid argument was supplied. in

    Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [0]: An invalid argument was supplied.

    Am un pachet wamp instalat, crezi ca e din cauza php-ului meu (5.2.9-2)? Ca nu pot sa imi dau seama cum sa fixez erorile.
    cateva date din phpinfo:

    IPv6 Support enabled
    Registered PHP Streams php, file, data, http, ftp, compress.zlib
    Registered Stream Socket Transports tcp, udp .

    Mersi anticipat &&…keep it up!

  • Jun 1, 2009 at 7:32 pm,  Reply

    Probabil adresa + port este folosita de o alta aplicatie, sau incerci sa pornesti de mai multe ori acelasi script.

  • Jul 1, 2009 at 1:48 pm,  Reply

    cum pot falosi un script

Leave a comment

Your email address will not be published.Field is required

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 Previous  All works Next