Skip to content

Innmind/OperatingSystem

Repository files navigation

OperatingSystem

Build Status codecov Type Coverage

Abstraction for most of the operating system the PHP code run on.

The goal is to deal with the operating system in a more abstract way (instead of dealing with concrete, low level, details).

Important

you must use vimeo/psalm to make sure you use this library correctly.

Installation

composer require innmind/operating-system

Documentation

Documentation is located in the documentation/ folder.

Usage

use Innmind\OperatingSystem\Factory;

$os = Factory::build();

Want to access the system clock ?

$os->clock() will return an instance of Innmind\TimeContinuum\Clock.

Want to access the filesystem ?

use Innmind\Url\Path;

$adapter = $os->filesystem()->mount(Path::of('/var/data/'));

$adater is an instance of Innmind\Filesystem\Adapter.

Want to list processes running on the system ?

$os->status()->processes()->all() will return a map of Inmmind\Immutable\Set<Innmind\Server\Status\Server\Process>.

Want to run a command on the system ?

use Innmind\Server\Control\Server\Command;

$process = $os
    ->control()
    ->processes()
    ->execute(Command::foreground('echo foo'));

$process is an instance of Innmind\Server\Control\Server\Process.

Want to open a port to the outside world ?

use Innmind\Socket\Internet\Transport;
use Innmind\IP\IPv4;
use Innmind\Url\Authority\Port;

$server = $os
    ->ports()
    ->open(
        Transport::tcp(),
        IPv4::localhost(),
        Port::of(1337),
    )
    ->match(
        static fn($server) => $server->unwrap(),
        static fn() => throw new \RuntimeException('Cannot open the socket'),
    );

$server is an instance of Innmind\Socket\Server.

Want to open a local socket ?

# process A
use Innmind\Socket\Address\Unix;

$server = $os->sockets()->open(Unix::of('/tmp/foo.sock'))->match(
    static fn($server) => $server->unwrap(),
    static fn() => throw new \RuntimeException('Cannot open the socket'),
);

$server is an instance of Innmind\Socket\Server.

# process B
use Innmind\Socket\Address\Unix;

$client = $os->sockets()->connectTo(Unix::of('/tmp/foo.sock'))->match(
    static fn($client) => $client->unwrap(),
    static fn() => throw new \RuntimeException('Cannot connect to the socket'),
);

$client is an instance of Innmind\Socket\Client.

Want to execute commands on a remote server ?

use Innmind\Url\Url;
use Innmind\Server\Control\Server\Command;

$process = $os
    ->remote()
    ->ssh(Url::of('ssh://user@server-address:1337'))
    ->processes()
    ->execute(Command::foreground('ls'));

$process is an instance of Innmind\Server\Control\Server\Process.

Want to do a http call ?

use Innmind\Http\{
    Message\Request\Request,
    Message\Method,
    ProtocolVersion,
};
use Innmind\Url\Url;

$response = $os
    ->remote()
    ->http()(new Request(
        Url::of('http://example.com'),
        Method::get,
        ProtocolVersion::v20,
    ));

Want to access current process id ?

$os->process()->id();

Want to pause the current process ?

use Innmind\TimeContinuum\Earth\Period\Minute;

$os->process()->halt(new Minute(1));

Want to listen for a signal ?

use Innmind\Signals\Signal;

$os->process()->signals()->listen(Signal::terminate, function() {
    // handle the signal here
});