Icicle
Icicle is a PHP library for writing asynchronous code using synchronous coding techniques
Install / Use
/learn @icicleio/IcicleREADME
Icicle is now deprecated in favor of Amp v2.0. This version is is currently under development, but close to release. The v2.0 branches are amp_v2 in all packages except the main Amp package, loop package, and postgres package, where v2.0 is the master branch.
Icicle
Icicle is a PHP library for writing asynchronous code using synchronous coding techniques.
Icicle uses Coroutines built with Awaitables and Generators to facilitate writing asynchronous code using techniques normally used to write synchronous code, such as returning values and throwing exceptions, instead of using nested callbacks typically found in asynchronous code.
Library Components
- Coroutines are interruptible functions for building asynchronous code using synchronous coding patterns and error handling.
- Awaitables act as placeholders for future values of asynchronous operations. Awaitables can be yielded in coroutines to define interruption points. Callbacks registered with awaitables may return values and throw exceptions.
- Observables represent asynchronous sets of values, providing operations usually associated with sets such as map, filter, and reduce. Observables also can be iterated over asynchronously within a coroutine.
- Loop (event loop) is used to schedule functions, run timers, handle signals, and poll sockets for pending data or await for space to write.
Available Packages
- Stream: Common coroutine-based interface for reading and writing data.
- Socket: Asynchronous stream socket server and client.
- Concurrent: Provides an easy to use interface for parallel execution with non-blocking communication and task execution.
- DNS: Asynchronous DNS query executor, resolver and connector.
- Filesystem: Asynchronous filesystem access.
- HTTP: Asynchronous HTTP server and client.
- WebSocket: Asynchronous WebSocket server and client.
- React Adapter: Adapts the event loop and awaitables of Icicle to interfaces compatible with components built for React.
Documentation and Support
Requirements
- PHP 5.5+ for v0.9.x branch (current stable) and v1.x branch (mirrors current stable)
- PHP 7 for v2.0 (master) branch supporting generator delegation and return expressions
Installation
The recommended way to install Icicle is with the Composer package manager. (See the Composer installation guide for information on installing and using Composer.)
Run the following command to use Icicle in your project:
composer require icicleio/icicle
You can also manually edit composer.json to add Icicle as a project requirement.
// composer.json
{
"require": {
"icicleio/icicle": "^0.9"
}
}
Suggested
- pcntl extension: Enables custom signal handling.
- ev extension: Extension providing the most performant event loop implementation.
- uv extension (PHP 7 only): Another extension providing a more performant event loop implementation (experimental).
Example
The example script below demonstrates how awaitables can be yielded in a coroutine to create interruption points. Fulfillment values of awaitables are sent to the coroutine and rejection exceptions are thrown into the coroutine.
#!/usr/bin/env php
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
use Icicle\Awaitable;
use Icicle\Coroutine\Coroutine;
use Icicle\Loop;
$generator = function () {
try {
// Sets $start to the value returned by microtime() after approx. 1 second.
$start = (yield Awaitable\resolve(microtime(true))->delay(1));
echo "Sleep time: ", microtime(true) - $start, "\n";
// Throws the exception from the rejected promise into the coroutine.
yield Awaitable\reject(new Exception('Rejected promise'));
} catch (Exception $e) { // Catches promise rejection reason.
echo "Caught exception: ", $e->getMessage(), "\n";
}
yield Awaitable\resolve('Coroutine completed');
};
$coroutine = new Coroutine($generator());
$coroutine->done(function ($data) {
echo $data, "\n";
});
Loop\run();
Related Skills
qqbot-channel
347.0kQQ 频道管理技能。查询频道列表、子频道、成员、发帖、公告、日程等操作。使用 qqbot_channel_api 工具代理 QQ 开放平台 HTTP 接口,自动处理 Token 鉴权。当用户需要查看频道、管理子频道、查询成员、发布帖子/公告/日程时使用。
docs-writer
100.1k`docs-writer` skill instructions As an expert technical writer and editor for the Gemini CLI project, you produce accurate, clear, and consistent documentation. When asked to write, edit, or revie
model-usage
347.0kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
Design
Campus Second-Hand Trading Platform \- General Design Document (v5.0 \- React Architecture \- Complete Final Version)1\. System Overall Design 1.1. Project Overview This project aims t
