You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
497 lines
13 KiB
PHTML
497 lines
13 KiB
PHTML
4 years ago
|
<?php
|
||
|
|
||
|
namespace Safe;
|
||
|
|
||
|
use Safe\Exceptions\LibeventException;
|
||
|
|
||
|
/**
|
||
|
* event_add schedules the execution of the event
|
||
|
* when the event specified in event_set occurs or in at least the time
|
||
|
* specified by the timeout argument. If
|
||
|
* timeout was not specified, not timeout is set. The
|
||
|
* event must be already initalized by event_set
|
||
|
* and event_base_set functions. If the
|
||
|
* event already has a timeout set, it is replaced by
|
||
|
* the new one.
|
||
|
*
|
||
|
* @param resource $event Valid event resource.
|
||
|
* @param int $timeout Optional timeout (in microseconds).
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_add($event, int $timeout = -1): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_add($event, $timeout);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Abort the active event loop immediately. The behaviour is similar to
|
||
|
* break statement.
|
||
|
*
|
||
|
* @param resource $event_base Valid event base resource.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_base_loopbreak($event_base): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_base_loopbreak($event_base);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* The next event loop iteration after the given timer expires will complete
|
||
|
* normally, then exit without blocking for events again.
|
||
|
*
|
||
|
* @param resource $event_base Valid event base resource.
|
||
|
* @param int $timeout Optional timeout parameter (in microseconds).
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_base_loopexit($event_base, int $timeout = -1): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_base_loopexit($event_base, $timeout);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Returns new event base, which can be used later in event_base_set,
|
||
|
* event_base_loop and other functions.
|
||
|
*
|
||
|
* @return resource event_base_new returns valid event base resource on
|
||
|
* success.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_base_new()
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_base_new();
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Sets the number of different event priority levels.
|
||
|
*
|
||
|
* By default all events are scheduled with the same priority
|
||
|
* (npriorities/2).
|
||
|
* Using event_base_priority_init you can change the number
|
||
|
* of event priority levels and then set a desired priority for each event.
|
||
|
*
|
||
|
* @param resource $event_base Valid event base resource.
|
||
|
* @param int $npriorities The number of event priority levels.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_base_priority_init($event_base, int $npriorities): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_base_priority_init($event_base, $npriorities);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Some event mechanisms do not survive across fork. The
|
||
|
* event_base needs to be reinitialized with this
|
||
|
* function.
|
||
|
*
|
||
|
* @param resource $event_base Valid event base resource that needs to be re-initialized.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_base_reinit($event_base): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_base_reinit($event_base);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Associates the event_base with the
|
||
|
* event.
|
||
|
*
|
||
|
* @param resource $event Valid event resource.
|
||
|
* @param resource $event_base Valid event base resource.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_base_set($event, $event_base): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_base_set($event, $event_base);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Assign the specified bevent to the
|
||
|
* event_base.
|
||
|
*
|
||
|
* @param resource $bevent Valid buffered event resource.
|
||
|
* @param resource $event_base Valid event base resource.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_buffer_base_set($bevent, $event_base): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_buffer_base_set($bevent, $event_base);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Disables the specified buffered event.
|
||
|
*
|
||
|
* @param resource $bevent Valid buffered event resource.
|
||
|
* @param int $events Any combination of EV_READ and
|
||
|
* EV_WRITE.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_buffer_disable($bevent, int $events): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_buffer_disable($bevent, $events);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Enables the specified buffered event.
|
||
|
*
|
||
|
* @param resource $bevent Valid buffered event resource.
|
||
|
* @param int $events Any combination of EV_READ and
|
||
|
* EV_WRITE.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_buffer_enable($bevent, int $events): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_buffer_enable($bevent, $events);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Libevent provides an abstraction layer on top of the regular event API.
|
||
|
* Using buffered event you don't need to deal with the I/O manually, instead
|
||
|
* it provides input and output buffers that get filled and drained
|
||
|
* automatically.
|
||
|
*
|
||
|
* @param resource $stream Valid PHP stream resource. Must be castable to file descriptor.
|
||
|
* @param mixed $readcb Callback to invoke where there is data to read, or NULL if
|
||
|
* no callback is desired.
|
||
|
* @param mixed $writecb Callback to invoke where the descriptor is ready for writing,
|
||
|
* or NULL if no callback is desired.
|
||
|
* @param mixed $errorcb Callback to invoke where there is an error on the descriptor, cannot be
|
||
|
* NULL.
|
||
|
* @param mixed $arg An argument that will be passed to each of the callbacks (optional).
|
||
|
* @return resource event_buffer_new returns new buffered event resource
|
||
|
* on success.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_buffer_new($stream, $readcb, $writecb, $errorcb, $arg = null)
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($arg !== null) {
|
||
|
$result = \event_buffer_new($stream, $readcb, $writecb, $errorcb, $arg);
|
||
|
} else {
|
||
|
$result = \event_buffer_new($stream, $readcb, $writecb, $errorcb);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Assign a priority to the bevent.
|
||
|
*
|
||
|
* @param resource $bevent Valid buffered event resource.
|
||
|
* @param int $priority Priority level. Cannot be less than zero and cannot exceed maximum
|
||
|
* priority level of the event base (see event_base_priority_init).
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_buffer_priority_set($bevent, int $priority): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_buffer_priority_set($bevent, $priority);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Sets or changes existing callbacks for the buffered event.
|
||
|
*
|
||
|
* @param resource $event Valid buffered event resource.
|
||
|
* @param mixed $readcb Callback to invoke where there is data to read, or NULL if
|
||
|
* no callback is desired.
|
||
|
* @param mixed $writecb Callback to invoke where the descriptor is ready for writing,
|
||
|
* or NULL if no callback is desired.
|
||
|
* @param mixed $errorcb Callback to invoke where there is an error on the descriptor, cannot be
|
||
|
* NULL.
|
||
|
* @param mixed $arg An argument that will be passed to each of the callbacks (optional).
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_buffer_set_callback($event, $readcb, $writecb, $errorcb, $arg = null): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($arg !== null) {
|
||
|
$result = \event_buffer_set_callback($event, $readcb, $writecb, $errorcb, $arg);
|
||
|
} else {
|
||
|
$result = \event_buffer_set_callback($event, $readcb, $writecb, $errorcb);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Writes data to the specified buffered event. The data is appended to the
|
||
|
* output buffer and written to the descriptor when it becomes available for
|
||
|
* writing.
|
||
|
*
|
||
|
* @param resource $bevent Valid buffered event resource.
|
||
|
* @param string $data The data to be written.
|
||
|
* @param int $data_size Optional size parameter. event_buffer_write writes
|
||
|
* all the data by default.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_buffer_write($bevent, string $data, int $data_size = -1): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_buffer_write($bevent, $data, $data_size);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Cancels the event.
|
||
|
*
|
||
|
* @param resource $event Valid event resource.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_del($event): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_del($event);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Creates and returns a new event resource.
|
||
|
*
|
||
|
* @return resource event_new returns a new event resource on success.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_new()
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_new();
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Assign a priority to the event.
|
||
|
*
|
||
|
* @param resource $event Valid event resource.
|
||
|
* @param int $priority Priority level. Cannot be less than zero and cannot exceed maximum
|
||
|
* priority level of the event base (see
|
||
|
* event_base_priority_init).
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_priority_set($event, int $priority): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \event_priority_set($event, $priority);
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Prepares the event to be used in event_add. The event
|
||
|
* is prepared to call the function specified by the callback
|
||
|
* on the events specified in parameter events, which
|
||
|
* is a set of the following flags: EV_TIMEOUT,
|
||
|
* EV_SIGNAL, EV_READ,
|
||
|
* EV_WRITE and EV_PERSIST.
|
||
|
*
|
||
|
* If EV_SIGNAL bit is set in parameter events,
|
||
|
* the fd is interpreted as signal number.
|
||
|
*
|
||
|
* After initializing the event, use event_base_set to
|
||
|
* associate the event with its event base.
|
||
|
*
|
||
|
* In case of matching event, these three arguments are passed to the
|
||
|
* callback function:
|
||
|
*
|
||
|
*
|
||
|
* fd
|
||
|
*
|
||
|
*
|
||
|
* Signal number or resource indicating the stream.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* events
|
||
|
*
|
||
|
*
|
||
|
* A flag indicating the event. Consists of the following flags:
|
||
|
* EV_TIMEOUT, EV_SIGNAL,
|
||
|
* EV_READ, EV_WRITE
|
||
|
* and EV_PERSIST.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* arg
|
||
|
*
|
||
|
*
|
||
|
* Optional parameter, previously passed to event_set
|
||
|
* as arg.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* @param resource $event Valid event resource.
|
||
|
* @param mixed $fd Valid PHP stream resource. The stream must be castable to file
|
||
|
* descriptor, so you most likely won't be able to use any of filtered
|
||
|
* streams.
|
||
|
* @param int $events A set of flags indicating the desired event, can be
|
||
|
* EV_READ and/or EV_WRITE.
|
||
|
* The additional flag EV_PERSIST makes the event
|
||
|
* to persist until event_del is called, otherwise
|
||
|
* the callback is invoked only once.
|
||
|
* @param mixed $callback Callback function to be called when the matching event occurs.
|
||
|
* @param mixed $arg Optional callback parameter.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_set($event, $fd, int $events, $callback, $arg = null): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($arg !== null) {
|
||
|
$result = \event_set($event, $fd, $events, $callback, $arg);
|
||
|
} else {
|
||
|
$result = \event_set($event, $fd, $events, $callback);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Prepares the timer event to be used in event_add. The
|
||
|
* event is prepared to call the function specified by the
|
||
|
* callback when the event timeout elapses.
|
||
|
*
|
||
|
* After initializing the event, use event_base_set to
|
||
|
* associate the event with its event base.
|
||
|
*
|
||
|
* In case of matching event, these three arguments are passed to the
|
||
|
* callback function:
|
||
|
*
|
||
|
*
|
||
|
* fd
|
||
|
*
|
||
|
*
|
||
|
* Signal number or resource indicating the stream.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* events
|
||
|
*
|
||
|
*
|
||
|
* A flag indicating the event. This will always be
|
||
|
* EV_TIMEOUT for timer events.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* arg
|
||
|
*
|
||
|
*
|
||
|
* Optional parameter, previously passed to
|
||
|
* event_timer_set as arg.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* @param resource $event Valid event resource.
|
||
|
* @param callable $callback Callback function to be called when the matching event occurs.
|
||
|
* @param mixed $arg Optional callback parameter.
|
||
|
* @throws LibeventException
|
||
|
*
|
||
|
*/
|
||
|
function event_timer_set($event, callable $callback, $arg = null): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($arg !== null) {
|
||
|
$result = \event_timer_set($event, $callback, $arg);
|
||
|
} else {
|
||
|
$result = \event_timer_set($event, $callback);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw LibeventException::createFromPhpError();
|
||
|
}
|
||
|
}
|