vadnica-logo
X

socket_set_blocking()

Funkcija socket_set_blocking() (alias za stream_set_blocking()) določa, ali bo operacija na vtičnici (kot je branje ali pisanje) ustavila izvajanje skripte, dokler ni končana, ali pa se bo takoj vrnila.

server.php

<?php
$host = "127.0.0.1";
$port = 8080;

// Ustvari TCP/IP vtičnico
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("Ne morem ustvariti vtičnice: " . socket_strerror(socket_last_error()));
}

// Poveži vtičnico na localhost:8080
if (socket_bind($socket, $host, $port) === false) {
    die("Ne morem se povezati na vtičnico: " . socket_strerror(socket_last_error($socket)));
}

// Začni poslušati na vtičnici
if (socket_listen($socket, 5) === false) {
    die("Ne morem poslušati na vtičnici: " . socket_strerror(socket_last_error($socket)));
}

echo "Strežnik posluša na $host:$port\n";

do {
    $client = socket_accept($socket);
    if ($client !== false) {
        $message = "Dobrodošli v moji PHP vadnici!\n";
        socket_write($client, $message, strlen($message));
        socket_close($client);
    }
} while (true);

socket_close($socket);
?>

client.php

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("Ne morem ustvariti vtičnice: " . socket_strerror(socket_last_error()));
}

// Poveži s strežnikom
$result = socket_connect($socket, "127.0.0.1", 8080);
if ($result === false) {
    die("Ne morem se povezati: " . socket_strerror(socket_last_error($socket)));
}

$input = "";
while ($out = socket_read($socket, 2048)) {
    $input .= $out;
}
if ($input) {
    echo "Prejeti podatki: $input\n";
} else {
    echo "Ni bilo prejetih podatkov.\n";
}

// Zapri vtičnico
socket_close($socket);
?>

Najprej zaženimo server.php skripto v terminalu (Windows v CMD). Strežnik bo poslušal na 127.0.0.1:8080. Nato zaženimo client.php skripto v drugem terminalu ali brskalniku. Odjemalec se bo poskušal povezati na ta strežnik. V CMD ali terminalu se moramo najprej premakniti v mapo z datoteko (ukaz cd ime_mape). Ko smo v pravi mapi, zaženemo PHP strežnik z ukazom:

php server.php

Če terminal javi napako, da ukaz 'php' ni prepoznan, pomeni, da PHP ni v sistemski poti (PATH). Napaka izgleda takole:

php : The term 'php' is not recognized...

V tem primeru morate terminalu natančno povedati, kje se nahaja program php.exe in katero datoteko naj zažene. Če imate datoteke v mapi C:\imeProjekta\ in XAMPP v mapi C:\xampp\, ukaz v terminalu sestavite takole:

C:\imeProjekta\ C:\xampp\php\php.exe server.php

Po pritisku na tipko Enter se izpiše:

Strežnik posluša na 127.0.0.1:8080

Ko se to izpiše, v drugem oknu terminala na enak način zaženemo še client.php:

Prejeti podatki: Dobrodošli v moji PHP vadnici!

Razlaga

Opombe:

Uporaba neblokiranega načina je koristna pri gradnji aplikacij, ki temeljijo na dogodkih, kjer ne želimo, da ena operacija ustavi celotno aplikacijo.

Zagon na Linux-u (LAMPP)

Če uporabljate Linux in imate nameščen XAMPP (LAMPP), je pot do PHP-ja drugačna. Odprite terminal in se premaknite v mapo s projektom, nato uporabite naslednji ukaz:

/opt/lampp/bin/php server.php

V Linux-u terminal običajno že ve, kje je PHP, če ste ga dodali v poti, zato pogosto zadostuje že samo php server.php. Ne pozabite na pravice za izvajanje, če bi zaganjali skripto neposredno.

Hvala za obisk! Dodajam politiko zasebnosti.

© 2024 Vse pravice pridržane.

Vam je koda pomagala? Če želite podpreti moj trud pri pripravi vodičev in vzdrževanju strani, mi lahko namenite donacijo za kavo.