Log over socket

Door Jelmer -, 19 jaar geleden, 3.412x bekeken

In je website (lokaal draaiend) zet je hier en daar log_send("bericht") en in een cli-scriptje laat je log_recieve(callback) rondjes draaien. Iedere keer wanneer log_send wordt aangeroepen zal log_recieve in je andere proces 1 maal de callback aanroepen. Voorbeeldje van een callback:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
function log_callback($message) {
    echo $message . "\n";
}


log_recieve('log_callback');
?>


Je kan de log_recieve-lus stoppen door je callback-functie een exception te laten gooien. Maar gewoon met ctrl + c in je terminal het script stoppen is bij mij de meest gangbare manier. log_send() vereist geen draaiende log_recieve()

Heel simpel, maar in sommige gevallen, wanneer jouw script bijvoorbeeld op de achtergrond met een andere webservice moet praten en je de output niet wilt verstoren heel handig.

Gesponsorde koppelingen

PHP script bestanden

  1. log-over-socket

 

Er zijn 3 reacties op 'Log over socket'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Hendel Berg
Hendel Berg
19 jaar geleden
 
0 +1 -0 -1
Ziet er mooi uit je script! Als ik de toepassing ervan goed begrijp, kan dit absoluut heel handig zijn!

Alleen krijg ik krijg het niet goed werkend. Want, als ik het goed begrijp, kun je 2 losse services met elkaar laten communiceren? Het volgende heb ik als testopstelling gemaakt

Een pagina om een bericht te verzenden
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
define('LOG_SOCKET_PATH', '/tmp/log_socket');

function
log_send($message) {
    $socket = @socket_create(AF_UNIX, SOCK_STREAM, 0);

    if(!$socket) {
        return false;
    }


    $success = false;

    if(@socket_connect($socket, LOG_SOCKET_PATH) && socket_write($socket, $message)) {
        $success = true;
    }

    
    socket_close($socket);
    
    return $success;
}


log_send('test');
?>



En een pagina om het bericht af te vangen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
define('LOG_SOCKET_PATH', '/tmp/log_socket');

function
log_recieve($callback) {
    if(file_exists(LOG_SOCKET_PATH)) {
        unlink(LOG_SOCKET_PATH);
    }

    
    $socket = socket_create(AF_UNIX, SOCK_STREAM, 0);

    socket_bind($socket, LOG_SOCKET_PATH);
    
    chmod(LOG_SOCKET_PATH, 0777);
        
    socket_listen($socket);

    socket_set_block($socket);

    try {
        while(true) {
            if(($connection = socket_accept($socket)) !== false) {
                while(socket_recv($connection, $buffer, 1024, 0)) {
                    $callback($buffer);
                }

                socket_close($connection);
            }
        }
    }
catch(Exception $e) {
        socket_close($socket);
    }
}

function
log_callback($message) {
    echo $message . "\n";
}


log_recieve('log_callback');
?>


Dit werkt niet. Ik krijg geen foutmelding o.i.d. Maar krijg ook totaal geen output te zien...

Had je de toepassing anders gedacht, of doe ik iets heel fout?
Jelmer -
Jelmer -
19 jaar geleden
 
0 +1 -0 -1
Merk op dat log_recieve in feite een oneindige lus is. Ik denk niet dat dit zonder meer goed werkt wanneer je hem via Apache draait. Zelf gebruik ik hem alleen vanaf de commandline, dus wanneer je het script direct aan PHP voert, en je de uitvoer in de terminal terugkrijgt. Je zou het eventueel werkend kunnen krijgen via ob_flush, maar dan moet je nog letten op de max_execution_time.

Verder weet ik eigenlijk niet of hij ook werkt onder Windows. Ik heb hem gemaakt op mac, en dat is eigenlijk ook de enige plek waar ik hem gebruik.
Hipska BE
Hipska BE
18 jaar geleden
 
0 +1 -0 -1
Werkt prima!
ik ga er binnenkort wat verder mee experimenteren..

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. log-over-socket

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.