Scripts

Log over socket

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: 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.

log-over-socket
<?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_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;
}

?>

Reacties

0
Nog geen reacties.