Введение
Документация активно дорабатывается! Подумайте о том, чтобы внести свой вклад.
PHPDaemon — это асинхронный демонизируемый фреймворк. С его помощью легко писать очень быстрые сетевые приложения, веб-сервисы и многое другое. Из коробки идут сервера FastCGI, HTTP, CGI, FlashPolicy, Telnet, WebSocket; клиенты MySQL, Redis, MongoDB, PostgreSQL, Memcached, IRC, XMPP и другие. Работать с сетью действительно просто. Программист средней руки может написать, к примеру, полноценного IRC-бота за час.
- Официальный сайт daemon.io.
- GitHub репозиторий github.com/kakserpom/phpdaemon.
- Обсудить проект можно в Google Groups.
- Отслеживание задач/ошибок
Пользование документацией ← Введение
Как видите, вся документация представлена на одной странице, поэтому вы можете пользоваться обычным поиском по странице (горячая клавиша Ctrl
+ F
или Cmd
+ F
)
Горячие клавиши ← Пользование документацией ← Введение
Ctrl/Alt
+↑
— к предыдущему разделу на текущем уровнеCtrl/Alt
+↓
— к следующему разделу на текущем уровнеCtrl/Alt
+→
— на уровень вглубьCtrl/Alt
+←
— на уровень ближе к поверхности
Установка
Требования ← Установка
PHP
версии не ниже 5.6;- Модули
posix
,pcntl
,sockets
,shmop
; libevent 2
;pecl-event
версии не ниже 1.6.1;
Рекомендуется также установить:
pecl-eio
для неблокирующего I/O файловой системы;pecl-inotify
для отслеживания изменений в файловой системе.
Исходный код ← Установка
Вы можете клонировать PHPDaemon репозиторий
$ git clone https://github.com/kakserpom/phpdaemon.git
Или скачать текущую версию в виде архива
$ wget https://github.com/kakserpom/phpdaemon/archive/master.zip
Установите необходимые модули
$ pecl install event eio inotify
Composer ← Установка
Добавьте раздел в ваш composer.json
"require" : {
"kakserpom/phpdaemon" : "dev-master"
}
Подробная информации о пакете на packagist.org.
CentOS/RedHat ← Установка
Для начала необходимо установить все сопуствующие утилиты.
$ sudo yum install -y git gcc openssl-devel libevent
Чтобы установить PHP 5.5 необходимо добавить Remi и Epel репозитории, потому что стандартный содержит старую версию.
Для RHEL/CentOS 6.4-6.0 32 Bit.
sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
Для RHEL/CentOS 6.4-6.0 64 Bit.
sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
#Устанавливаем PHP.
sudo yum --enablerepo=remi,remi-test install -y php-cli php-devel php-pear php-process
#Далее устанавливаем pecl модули.
sudo -i
pecl install event eio
#Для корректной работы модуля event и eio необходим модуль sockets.
#В системах RedHat/CentOS файлы конфигурации подгружаются в алфавитном порядке, поэтому назовем их z-event.ini и z-eio.ini соответственно.
echo "extension=event.so" > /etc/php.d/z-event.ini
echo "extension=eio.so" > /etc/php.d/z-eio.ini
exit #выходим из sudo
Установите date.timezone
в /etc/php.ini.
#Подготовим директорию для установки PHPDaemon.
sudo mkdir /opt/phpdaemon
sudo chown [your user]:[your group] /opt/phpdaemon
cd /opt/phpdaemon
#Устанавливаем PHPDaemon.
cd /opt/phpdaemon
git clone https://github.com/kakserpom/phpdaemon.git ./
#Копируем конфигурационный файл из примера.
cp /opt/phpdaemon/conf/phpd.conf.example /opt/phpdaemon/conf/phpd.conf
#Сделаем ссылку на phpd
ln -s /opt/phpdaemon/bin/phpd /usr/bin/phpd
Запускаем PHPDaemon
$ sudo phpd start --verbose-tty=1
Опция --verbose-tty=1
указывет демону выводить журнал в терминал.
Если вы видите что-то похожее на это:
[PHPD] Loaded config file: '/opt/phpdaemon/conf/phpd.conf'
[PHPD] Loaded config file: 'conf/conf.d/ExampleJabberBot.conf'
[PHPD] Loaded config file: 'conf/conf.d/FastCGI.conf'
[PHPD] Loaded config file: 'conf/conf.d/FlashpolicyServer.conf'
[PHPD] Loaded config file: 'conf/conf.d/HTTPServer.conf'
[PHPD] Loaded config file: 'conf/conf.d/IdentServer.conf'
[PHPD] Loaded config file: 'conf/conf.d/SSL-sample.conf'
[PHPD] Loaded config file: 'conf/conf.d/WebSocketServer.conf'
Поздравляем! PHPDaemon запущен!
Ubuntu ← Установка
#Для начала необходимо установить все сопутствующие утилиты.
sudo apt-get install gcc make libcurl4-openssl-dev libevent-dev git libevent
#Устанавливаем PHP 5.5.
sudo apt-get install php5-cli php5-dev php-pear
#Далее устанавливаем pecl модули.
sudo -i
pecl install event eio
echo "extension=event.so" > /etc/php5/mods-available/event.ini
echo "extension=eio.so" > /etc/php5/mods-available/eio.ini
#Создаем ссылки
ln -s /etc/php5/mods-available/event.ini /etc/php5/cli/conf.d/event.ini
ln -s /etc/php5/mods-available/eio.ini /etc/php5/cli/conf.d/eio.ini
#Подготовим директорию для установки PHPDaemon.
mkdir /opt/phpdaemon
chown [your user]:[your group] /opt/phpdaemon
exit #выходим из sudo
#Устанавливаем PHPDaemon.
cd /opt/phpdaemon
git clone https://github.com/kakserpom/phpdaemon.git ./
#Создаем конфигурационный файл из примера.
cp /opt/phpdaemon/conf/phpd.conf.example /opt/phpdaemon/conf/phpd.conf
#Добавляем права на исполнение
chmod ug+x /opt/phpdaemon/bin/*
#Сделаем ссылку на phpd для удобного управления демоном
alias phpd='/opt/phpdaemon/bin/phpd'
#Локальный алиас для sudo
alias sudo='sudo '
Пробуем запустить демон.
$ sudo phpd start --verbose-tty=1
Опция --verbose-tty=1
указывает демону выводить журнал в терминал.
Если вы видите что-то похожее на это:
[PHPD] Loaded config file: '/opt/phpdaemon/conf/phpd.conf'
[PHPD] Loaded config file: 'conf/conf.d/ExampleJabberBot.conf'
[PHPD] Loaded config file: 'conf/conf.d/FastCGI.conf'
[PHPD] Loaded config file: 'conf/conf.d/FlashpolicyServer.conf'
[PHPD] Loaded config file: 'conf/conf.d/HTTPServer.conf'
[PHPD] Loaded config file: 'conf/conf.d/IdentServer.conf'
[PHPD] Loaded config file: 'conf/conf.d/SSL-sample.conf'
[PHPD] Loaded config file: 'conf/conf.d/WebSocketServer.conf'
Поздравляем! PHPDaemon запущен!
Добавим алиасы чтобы они были доступны после перезагрузки
echo "alias phpd='/opt/phpdaemon/bin/phpd'" >> ~/.bashrc
echo "alias sudo='sudo '" >> ~/.bashrc
Gentoo ← Установка
Вы можете установить PHPDaemon с помощью layman overlay.
Добавьте ссылку в секцию overlays в файле layman.cfg:
https://github.com/lexa-uw/layman-phpdaemon/blob/master/layman.xml
В итоге будет выглядеть примерно так:
overlays : http://www.gentoo.org/proj/en/overlays/repositories.xml
https://github.com/lexa-uw/layman-phpdaemon/blob/master/layman.xml
Выполняем команды
sudo layman -L
sudo layman -a phpdaemon
sudo emerge www-servers/phpdaemon
К примеру, нижеследующие команды устанавливают phpdaemon версии 0.4.1, 1.0_beta2 и еженедельный релиз.
$ sudo emerge "=www-servers/phpdaemon-0.4.1" "=www-servers/phpdaemon-1.0_beta2" "www-servers/phpdaemon"
Это пакеты, которые будут объединены по порядку:
Расчёт зависимостей... готово!
[ebuild R ~] www-servers/phpdaemon-0.4.1:0.4::phpdaemon USE="libevent -examples -runkit" 0 kB
[ebuild R ~] www-servers/phpdaemon-1.0_beta2:1.0::phpdaemon USE="eio event -runkit" 0 kB
[ebuild R ~] www-servers/phpdaemon-20130907:weekly::phpdaemon USE="eio event -runkit" 0 kB
...
После установки вы можете использовать "eselect phpdaemon set" для создания символической ссылки на /usr/bin/phpd
$ sudo eselect phpdaemon list
Available phpdaemon targets:
[1] phpd0.4
[2] phpd1.0
[3] phpdweekly
$ sudo eselect phpdaemon set 3
$ sudo eselect phpdaemon show
Current phpdaemon:
weekly
Добавить phpdaemon в автозагрузку:
$ rc-update add phpd default
* service phpd added to runlevel default
Добавить отдельные init.d скрипты для разных версий:
$ ln -s /etc/init.d/phpd /etc/init.d/phpd-0.4
$ ln -s /etc/init.d/phpd /etc/init.d/phpd-1.0
$ ln -s /etc/init.d/phpd /etc/init.d/phpd-weekly
Добавить phpd-1.0 в автозагрузку:
$ rc-update add phpd-1.0 default
* service phpd added to runlevel default
Быстрый старт
PHPDaemon представляет из себя один мастер-процесс с несколькими рабочими процессами.
Приложение, в зависимости от нагрузки, инициализируется в одном или нескольких рабочих процессах. Во втором случае запрос будет передан одному свободному рабочему процессу.
Механизма взаимодействия между ребочими процессами не предусмотрено, поэтому для синхронизации приложений в разных процессах вы можете использовать стороннее ПО, например Redis.
Исполняющий файл находится в дирктории ./bin/phpd
.
Вы можете создать свой исполняющий файл, как показано в примере ./bin/sampleapp
.
Перед запуском демон проверяет переменную $configFile
, используя её для загрузки конфигурации.
Псевдотипы ← Быстрый старт
url ← Псевдотипы ← Быстрый старт
Псевдотип url @TODO
Управление
$ phpd start |
Запуск демона |
$ phpd stop |
Остановка демонаSYSCTL: SIGTERM, SIGQUIT |
$ phpd hardstop |
Принудительная остановка демонаSYSCTL: SIGINT, SIGKILL |
$ phpd update |
Обновление конфигурацииSYSCTL: SIGHUP |
$ phpd reload |
Плавный перезапуск всех рабочих процессовSYSCTL: SIGUSR2 |
$ phpd reopenlog |
Переоткрытие журналовSYSCTL: SIGUSR1 |
$ phpd restart |
Плавный перезапуск демона |
$ phpd hardrestart |
Принудительный перезапуск демона |
$ phpd status |
Вывод статуса демона |
$ phpd fullstatus |
Вывод подробной информации работы демона |
$ phpd configtest |
Вывод глобальных опций. В скобках будет указано значение по-умочанию. |
$ phpd log [-n K] |
Вывод журнала в реальном времени с помощью команды tail -f . C параметром -n K выводится K последних строк. Или используйте -n +K для вывода строк, начиная с K. |
$ phpd runworker |
Запуск рабочего процесса без мастер-процесса. Используется для отладки. |
Конфигурация
Типы данных ← Конфигурация
Большинство опций phpdaemon описывается своими типами данных, позволяющие указывать значения расширенным форматом.
Size ← Типы данных ← Конфигурация
Предназначен для записи объема информации. Можно записать в виде целого числа или целого числа с постфиксом.
Формат записи: integer [bBkKmMgG]?
Постфикс | Множитель | Пример | Значение |
---|---|---|---|
b, B | 1 | 1b | 1 |
k | 1000 | 1k | 1000 |
K | 1024 | 1K | 1024 |
m | 1000 * 1000 | 1m | 1000000 |
M | 1024 * 1024 | 1M | 1048576 |
g | 1000 * 1000 * 1000 | 1g | 1000000000 |
G | 1024 * 1024 * 1024 | 1G | 1073741824 |
Time ← Типы данных ← Конфигурация
Предназначен для записи количества секунд. Число может быть с плавающей точкой с использованием только символа точки .
.
Формат записи: float [smhd]?
или (float [smhd])+
Постфикс | Множитель | Пример | Значение |
---|---|---|---|
s | 1 | 1s | 1 |
m | 60 | 1m | 60 |
h | 60 * 60 | 2h 12s | 7212 |
d | 60 * 60 * 24 | 1d 15m 32s | 87332 |
Number ← Типы данных ← Конфигурация
Предназначен для записи чисел.
Формат записи: integer [kKmMgG]?
Постфикс | Множитель | Пример | Значение |
---|---|---|---|
k, K | 1000 | 1k | 1000 |
m, M | 1000 * 1000 | 1M | 1000000 |
g, G | 1000 * 1000 * 1000 | 1g | 1000000000 |
Глобальные опции ← Конфигурация
Два способа установки опций:
- Конфигурационный файл
./conf/phpd.conf
; - Параметры командной строки, например
--max-workers=1
.
Параметры командной строки имеют больший приоритет.
Конфигурационный файл ← Глобальные опции ← Конфигурация
Формат записи опции название-опции [значение];
Название опции не чувствительно к регистру и использованию знака дефиса -
.
Следующие варианты написания равнозначны:
add-include-path
;addincludepath
;addIncludePath
;ADDInclude-path
.
Значение может отсутствовать, что приравнивется к bool(true)
, либо может быть записано следующими способами:
null
;- булевым выражением
false
илиtrue
; - целым числом;
- числом с плавающей точкой;
- строкой; если в строке присутствует символ пробела
,
, то строку необходимо обернуть одинарными или двойными кавычками; - массивом.
Для записи массива используется разделитель пробел
или запятая ,
. В одном значении можно использовать оба разделителя одновременно.
Пример опции | Вывод var_dump |
---|---|
var-name; | bool(true) |
var-name null; | NULL |
var-name true; | bool(true) |
var-name false; | bool(false) |
var-name 0; | int(0) |
var-name 1; | int(1) |
var-name 3.14; | float(3.14) |
var-name "3.14"; | string(4) "3.14" |
var-name "пример. длинной строки,второй пример"; | string(67) "пример. длинной строки,второй пример" |
var-name пример. длинной строки,второй пример; | array(5) { [0]=> string(13) "пример." [1]=> string(14) "длинной" [2]=> string(12) "строки" [3]=> string(12) "второй" [4]=> string(12) "пример" } |
var-name 1, 'a' null 3.14 'пару слов'; | array(5) { [0]=> int(1) [1]=> string(1) "a" [2]=> NULL [3]=> float(3.14) [4]=> string(17) "пару слов" } |
Ниже будут перечислены глобальные опции демона в формате:
название-опции (тип-данных = значение-по-умолчанию);
Плавный перезапуск рабочих процессов ← Глобальные опции ← Конфигурация
-
max-requests (Number = '10k')
Максимальное количество запросов перед перезапуском рабочего процесса.0
– неограничено. -
max-memory-usage (Size = '0b')
Максимальный допустимый порог потребления памяти рабочим процессом.0
– неограничено. -
max-idle (Time = '0s')
Максимальное время простоя рабочего процесса перед перезапуском.0
– неограничено. -
auto-reload (Time = '0s')
Задает интервал проверки всех подключенных файлов. При изменении файлов плавно перезагружает рабочие процессы. auto-reimport (boolean = false)
На лету импортирует методы и функции из измененных файлов с помощью runkit, без перезагрузки рабочего процесса.
Основные пути ← Глобальные опции ← Конфигурация
-
pid-file (string = '/var/run/phpd.pid')
Путь к pid-файлу. Убедитесь что имеется доступ на запись. -
config-file (string = '/etc/phpdaemon/phpd.conf;/etc/phpd/phpd.conf;./conf/phpd.conf')
Путь к файлу конфигурации. Можно указать несколько через разделитель;
(точка с запятой).
Будет загружен только первый найденный конфигурационный файл. -
path (string = '/etc/phpdaemon/AppResolver.php;./conf/AppResolver.php')
Путь к Application Resolver. Можно указать несколько через разделитель;
(точка с запятой).
Будет загружен только первый найденный файл. add-include-path (string = null)
Дополнительные пути для директивы include_path.
Можно указать несколько через разделитель:
(двоеточие).
Связанные с мастер-процессом ← Глобальные опции ← Конфигурация
-
mpm-delay (Time = '0.1s')
Интервал между срабатываниями Мульти-Процессного Менеджера.
МПМ отвечает за запуск/выключение рабочих процессов, согласно настройкам. -
start-workers (Number = 4)
Кол-во рабочих процессов при запуске демона. -
min-workers (Number = 4)
Минимальное допустимое кол-во рабочих процессов. -
max-workers (Number = 8)
Максимальное допустимое кол-во рабочих процессов. -
min-spare-workers (Number = 2)
Минимальное количество простаивающих рабочих процессов: phpDaemon запустит дополнительный рабочие процессы когда нагрузка увеличится, чтобы простаивающих рабочих процессов было достаточно. Сверху ограничивается параметром max-workers. -
max-spare-workers (Number = 0)
Максимальное кол-во простаивающих рабочих процессов. phpDaemon выключит дополнительные рабочие процессы когда нагрузка спадёт. -
master-priorty (Number = 100)
Приоритет мастер-процесса. Чем меньше значение, тем выше приоритет. -
ipc-thread-priority (Number = 100)
Приоритет IPC процесса. Чем меньше значение, тем выше приоритет. -
worker-priority (Number = 4)
Приоритет рабочего процесса. Чем меньше значение, тем выше приоритет. throw-exception-on-shutdown (boolean = false)
Выбрасывать исключениеException('event shutdown')
по завершению процесса.
Запросы ← Глобальные опции ← Конфигурация
-
locale (string = '')
Устанавливает настройки локали. Можно указать несколько через разделитель,
(запятая). ob-filter-auto (boolean = true)
Включить стандартныйob_
фильтр.
Рабочие процессы ← Глобальные опции ← Конфигурация
-
chroot (string = '/')
Смена системного корня для рабочих процессов. -
cwd (string = '.')
Задание рабочей директории для рабочих процессов. -
user (string = null)
Пользователь для рабочих процессов. Используйте безопасного пользователя, не используйте root, если не знаете что делаете. -
group (string = null)
Группа для рабочих процессов. Используйте безопасную группу, не используйте root, если не знаете что делаете. auto-gc (Number = '1k')
Включает сборщик мусора вызываемый каждые n запросов.0
– выключает совсем.
Журналирование и отладка ← Глобальные опции ← Конфигурация
-
logging (boolean = true)
Включает журналирование. -
log-storage (string = '/var/log/phpdaemon.log')
Путь к файлу журнала. -
log-errors (boolean = true)
Включает журналирование локальных ошибок таких как Undefined route in WebSocketServer, и т.д. -
log-worker-set-state (boolean = false)
Включает журналирование смены состояния рабочего процесса. -
log-events (boolean = false)
Включает журналирование сетевых событий. -
log-signals (boolean = false)
Включает журналирование системных сигналов. -
verbose-tty (boolean = false)
Если параметр включен, журнал будет выводиться в терминал (STDOUT).Учтите, что в обычном варианте запуска (не runworker) ввод из терминала игнорируется, хотя после запуска с этим параметром может показаться, что программа привязана к терминалу.
restrict-error-control (boolean = false)
Выключает оператор управления ошибками@
.
Подсистема ввода-вывода POSIX ← Глобальные опции ← Конфигурация
-
eio-enabled (boolean = true)
Включает поддержку EIO. -
eio-set-max-idle (Time = null)
Устанавливает максимальное количество ожидающих потоков. -
eio-set-min-parallel (Number = null)
Устанавливает минимальное количество параллельных потоков. -
eio-set-max-parallel (Number = null)
Устанавливает максимальное количество параллельных потоков. -
eio-set-max-poll-reqs (Number = null)
Устанавливает максимальное количество обрабатываемых запросов. eio-set-max-poll-time (Time = null)
Устанавливает максимальное время выполнения.
Приложения ← Конфигурация
-
enable (boolean = true)
Разрешает демону инициализацию приложения. По-умочанию, описанное в конфигурационном файле приложение, всегда включено. limit-instances (integer = null)
Ограничивает количество автоматически запускаемых приложений во всех рабочих процессах. По-умолчанию приложение запускается во всех рабочих процессах.
Разработка
Маршрутизация ← Разработка
Получая запросы демон первым делом должен определить какому приложению он должен передать обработку. Для этого служит обработчик запросов AppResolver.
Вы можете определить свой обработчик или использовать пример ./conf/AppResolver.php
.
Название файла должно совпадать с названием класса обработчика.
Правила описываются в методе getRequestRoute
.
Он принимает два аргумента:
$req
— объектstdClass
, с параметрами запроса;$upstream
— объект сервера, принимающий входящие запросы, например\PHPDaemon\Servers\HTTP\Connection
.
Результатом работы метода может быть:
- Имя приложения;
null
для попытки передать запрос приложению по-умолчанию;false
для завершения обработки запроса.
Не забудьте указать в конфигурационном файле путь до вашего AppResolver.
В настройках сервера, принимающего запросы, с помощью опции responder
можно указать имя приложения по-умолчанию, которому будет передан запрос, если getRequestRoute
вернул null
.
Приложение ← Разработка
Приложением в демоне является класс, наследуемый от \PHPDaemon\Core\AppInstance
.
Название файла должно совпадать с названием приложения.
Разместите свое приложение в каталоге со стандартными приложениями демона ./PHPDaemon/Applications
.
Укажите namespace PHPDaemon\Applications;
.
Вы можете разместить свое приложение в любом каталоге. Для этого слудет указать путь до каталога в опции add-include-path и
namespace
относительно этого каталога.
Для обработки входящих запросов надо объявить метод beginRequest
, который должен возвращать объект запроса. Про него будет сказано чуть ниже.
Пример простейшего приложения ./PHPDaemon/Applications/MyApp.php
:
namespace PHPDaemon\Applications;
class MyApp extends \PHPDaemon\Core\AppInstance {
public function beginRequest($req, $upstream) {
return new MyAppRequest($this, $upstream, $req);
}
}
При запросе от клиента соединение получает один случайный рабочий процесс. Запрос передается на обработку приложению.
По-умолчанию приложение инициализируется во всех рабочих процессах. Опция
limit-instances
ограничивает количество автоматически запускаемых копий приложения во всех рабочих процессах.
Основные методы приложения:
-
void protected init ( )
- Вызывается единожды перед инициализацей приложения
-
void public onReady ( )
- Вызывается когда рабочий процесс, в котором запущено приложение, готов к обработке
-
boolean protected onShutdown ( $graceful = false )
- Вызывется при попытке завершения приложения. По-умолчанию возвращает
true
. Если вернутьfalse
, приложение не будет завершено. Повторная попытка будет через 1 секунду $graceful
— Флаг плавного завершения приложения
- Вызывется при попытке завершения приложения. По-умолчанию возвращает
-
object public beginRequest ( object $req, object $upstream )
- Запрашивает объект нового запроса к приложению. Метод может вернуть false, это значит что приложение отказывается (или не умеет) обрабатывать запросы. После вызова этого метода, объект запроса попадает в очередь и вызывается итеративно
$req
— Объект запроса$upstream
— Объект сервера
Если не объявлять метод
beginRequest
приложение при инициализации попытается найти и вернуть объект класса c постфиксом Request. Т.е. для приложенияMyApp
приложение попытается найтиMyAppRequest
.
Обработка запросов ← Разработка
Каждый клиентский запрос сопровождается созданием объекта запроса в методе beginRequest
в приложении.
Объект запроса будет уничтожен сразу после отправки результата клиенту.
В Websocket объект запроса будет уничтожен при закрытии соединения.
Класс объекта запроса должен наследоваться от \PHPDaemon\HTTPRequest\Generic
.
Основной рабочий код, обрабатывающий код, необходимо размещать в методе run
.
К свойствам запроса можно обращаться по $this->attrs
или через глобальные переменные $_GET, $_POST, $_COOKIE, $_REQUEST, $_SESSION, $_FILES, $_SERVER.
Основные методы объекта запроса:
-
void protected init ( )
- Вызывается единожды при создании объекта запроса
-
void protected run ( )
- Вызывается диспетчером очереди до тер пор, пока не будет возращен либо
null
, либо1
или не будет вызван метод terminate()
- Вызывается диспетчером очереди до тер пор, пока не будет возращен либо
- init() - вызывается единожды при создании объекта запроса.
- run() - вызывается диспетчером очереди до тер пор, пока не будет возращен код 1 или не будет вызван метод terminate().
- terminate() - его не следует перезагружать. Метод прерывает и завершает выполнение запроса.
- sleep($seconds) - время в секундах, через которое необходимо вернуться к запросу.
- wakeup() - прервать sleep.
- onAbort() - событие сброса запроса, вызывается в случае если клиент отвалился.
- header($header) - установить заголовок HTTP-ответа.
- out($str) - записать строку в поток вывода.
- combinedOut($str) - записать строку в поток вывода, содержащую и заголовки и тело.
- stdin($str) - обработчик потока ввода запроса.
- finish($status) - 0 - normal, -1 - abort, -2 - termination
- chunked() - устанавливает Transfer-Encoding: chunked.
Серверы и клиенты ← Разработка
Отладка ← Разработка
Примеры ← Разработка
Примеры работы компонентами демона лежат в каталоге ./PHPDaemon/Examples
.
В конфигурационном файле путь до примера можно указать так:
Examples\Example {}
Не забудьте настроить необходимые серверы и клиенты.
В данный момент мы проверяем и переносим все примеры в каталоги компонентов. Примеры для клиента HTTP вы можете посмотреть в
./PHPDaemon/Clients/HTTP/Examples
.
Все примеры подробно прокомментированы, поэтому разобраться в них для вас не должно составить труда.
Серверы
Серверы предназначены для приема запросов и передачи их приложениям.
Каждый сервер представляет собой класс наследуемый от Сеть\Сервер, который в свой очередь наследуется от Сеть\Пул. Сервер можно инициировать прямо в пользовательском приложении, например:
/* ... */
$this->pool = \PHPDaemon\Servers\FlashPolicy::getInstance([
'listen' => 'tcp://0.0.0.0:843'
]);
$this->pool->onReady();
/* ... */
Но не забывайте, что в таком случае следует отправлять ему onReady(), onShutdown() и onConfigUpdated() события.
В большинстве случаев сервер запускается одноименнным приложением Pool.
# контекст для ssl соединения (опционально)
TransportContext:myContext {
tls;
certFile "/path/to/cert.pem";
pkFile "/path/to/privkey.pem";
passphrase "";
verifyPeer true;
allowSelfSigned true;
}
# слушаем 80 и 443 порт
Pool:HTTPServer {
listen "tcp://0.0.0.0:80", "tcp://0.0.0.0:443##myContext";
port 80;
privileged;
maxconcurrency 1;
}
Опции серверов ← Серверы
В данном разделе перечислены опции, используемые всеми серверами.
-
listen (string|array)
Прослушиваемые сервером адреса. Можно указать несколько через разделитель","
. -
privileged
@TODO -
max-concurrency
Максимальное количество открытых соединений. -
max-allowed-packet
Максимальный допустимый размер пакета. -
connection-class
Класс соединения по-умолчанию. -
name
@TODO -
allowed-clients
Разрешенные IP-адреса или маски через запятую. -
ssl
Включает ssl. -
ssl-port
@TODO -
cert-file
@TODO -
pk-file
@TODO -
passphrase
@TODO -
verify-peer
@TODO -
allow-self-signed
@TODO -
verify-depth
@TODO ca-file
@TODO
HTTP ← Серверы
Сервер использует пространство имен HTTPRequest.
Это транспортное приложение предоставляет HTTP сервер для phpDaemon. Входящие Websocket соединения будут переданы приложению WebsocketServer.
HTTP пробует определить приложение через AppResolver, не забудьте сконфигурировать его.
-
listen (string = 'tcp://0.0.0.0')
Какие адреса слушать, через запятую -
port (integer = 80)
Прослушиваемый порт -
allowed-clients (string = '127.0.0.1')
IP адреса (через запятую) которым позволено делать запросы. CIDR-маски поддерживаются -
send-file (boolean = false)
Оптимизирует обработку запросов, предварительно записывая их в файл. Опция будет игнорироваться если передан параметрserver['DONT_USE_SENDFILE']
-
send-file-dir (string = '/dev/shm')
Директория для sendfile -
send-file-prefix (string = 'http-')
Префикс для sendfile файлов -
send-file-onlybycommand (boolean = false)
Включать sendfile если переданserver['USE_SENDFILE']
-
expose (boolean = true)
Включать версию PHPDaemon в заголовкеX-Powered-By
-
keepalive (Time = '0s')
Таймаут бездействия перед закрытием keep-alive соединения -
chunksize (Size = '8k')
Размер куска -
defaultcharset (string = 'utf-8')
Кодировка по-умолчанию -
wss-name (string = '')
Имя пула WebSocket-сервера, куда направлять WebSocket-соединения -
fps-name (string = '')
Имя пула FlashPolicy-сервера, куда адресовать FlashPolicy-соединения -
upload-max-size (Size = ini_get('upload_max_filesize'))
Максимальный размер загружаемого файла responder (string = null)
Имя приложения по-умолчанию для обработки запросов с данного сервера
FastCGI ← Серверы
Сервер использует пространство имен HTTPRequest.
Это транспортное приложение представляет FastCGI сервер для phpDaemon.
После конфигурирования phpDaemon вам также следует задействовать веб-сервер, который поддерживает FastCGI. Если вы еще не сделали выбор в пользу одного из них, мы советуем NGINX.
Веб-сервер может передавать FastCGI-серверу параметр APPNAME, который содержит название приложения которое должно обработать данный запрос. Если параметр не передан, FastCGI-сервер попробует определить это через AppResolver.
Пример конфигурации NGINX:
location /Example/ {
fastcgi_pass unix:/tmp/phpdaemon.fcgi.sock;
fastcgi_param APPNAME Example;
include fastcgi_params;
}
-
listen (string = 'tcp://127.0.0.1,unix:///tmp/phpdaemon.fcgi.sock')
Какие адреса слушать, через запятую -
port (integer = 80)
Прослушиваемый порт -
auto-read-body-file (boolean = true)
Автоматически реагирует на FastCGI параметр REQUEST_BODY_FILE и читает тело запроса из файла, созданного веб-сервером -
allowed-clients (string = '127.0.0.1')
IP адреса (через запятую) которым позволено делать запросы. CIDR-маски поддерживаются -
send-file (boolean = false)
Оптимизирует обработку запросов, предварительно записывая их в файл. Опция будет игнорироваться если передан параметрserver['DONT_USE_SENDFILE']
-
send-file-dir (string = '/dev/shm')
Директория для sendfile -
send-file-prefix (string = 'fcgi-')
Префикс для sendfile файлов -
send-file-onlybycommand (boolean = false)
Включать sendfile если переданserver['USE_SENDFILE']
-
expose (boolean = true)
Включать версию PHPDaemon в заголовкеX-Powered-By
-
keepalive (Time = '0s')
Таймаут бездействия перед закрытием keep-alive соединенияЕсли вы используете значение отличное от 0, учтите что nginx и некоторые другие веб-сервера НЕ ПОДДЕРЖИВАЮТ keep-alive соединения с FastCGI-бекэндами.
-
chunksize (Size = '8k')
Размер куска -
defaultcharset (string = 'utf-8')
Кодировка по-умолчанию -
wss-name (string = '')
Имя пула WebSocket-сервера, куда направлять WebSocket-соединения -
fps-name (string = '')
Имя пула FlashPolicy-сервера, куда адресовать FlashPolicy-соединения -
upload-max-size (Size = ini_get('upload_max_filesize'))
Максимальный размер загружаемого файла responder (string = null)
Имя приложения по-умолчанию для обработки запросов с данного сервера
DebugConsole ← Серверы
Это транспортное приложение предоставляет интерактивную отладочную консоль для phpDaemon.
# telnet 127.0.0.1 8818
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Welcome! DebugConsole for phpDaemon.
login secret
OK.
eval echo 123;
123
Опции ← DebugConsole ← Серверы
-
listen (string = 'tcp://127.0.0.1')
Какие адреса слушать, через запятую -
port (integer = 8818)
Прослушиваемый порт passphrase (string = 'secret')
Пароль для аутентификации
FlashPolicy ← Серверы
Это простое приложение предоставляет Flashpolicy сервер для phpDaemon.
Это приложение необходимо включить в случае если вы хотите присоединяться к серверу посредством Flash.
Опции ← FlashPolicy ← Серверы
-
listen (string = '0.0.0.0')
Какие адреса слушать, через запятую -
port (integer = 843)
Прослушиваемый порт file (string = getcwd() . '/conf/crossdomain.xml')
Файл Flash-политики
Servers\Ident ← Серверы
Servers\IRCBouncer ← Серверы
Lock ← Серверы
Требует рефакторинга
Servers\Socks ← Серверы
WebSocket ← Серверы
Сервер использует пространство имен HTTPRequest.
Это транспортное приложение представляет WebSocket сервер для phpDaemon.
Ваше приложение должно получать ссылку на экземпляр WebSocketServer и вызывать addRoute() для добавления своих путей. Callback-функция пути должна возвращать новый экземпляр вашего класса, который наследуется от WebSocketRoute и определяет метод onFrame. Внутри метода onFrame мы можете обращаться к $this->client->sendFrame() для отправки пакетов клиенту.
-
listen (string = '0.0.0.0')
Какие адреса слушать, через запятую -
port (integer = 8047)
Прослушиваемый порт -
max-allowed-packet (Size = new \PHPDaemon\Config\Entry\Size('1M'))
Максимальный размер пакета -
expose (boolean = true)
Включать версию PHPDaemon в заголовкеX-Powered-By
fps-name (string = '')
Имя пула FlashPolicy-сервера, куда адресовать FlashPolicy-соединения
Клиенты
В основе всех клиентов лежит пространство имен Network, изучение которого даст большее представление о возможностях клиентов и сетевой работы демона в целом.
Основы ← Клиенты
-
server (string)
Адрес сервера. Записывается специальным форматом, описанном в разделе Опция server -
servers (array)
Адреса серверов, записанные в формате опцииserver
, разделенные символом запятая,
. При подключении клиента будет использоваться рандомно выбранный сервер. Учтите, данная опция будет игнорироваться если установлена опцияserver
. maxconnperserv
protologging
Asterisk ← Клиенты
namespace PHPDaemon\Clients\Asterisk;
Раздел устарел!
Asterisk - это АТС с открытым исходным кодом. AMI - программный интерфейс (API) Asterisk для управления системой, который позволяет разработчикам отправлять команды на сервер, считывать результаты их выполнения, а так же получать уведомления о происходящих событиях в реальном времени. Клиент Asterisk обеспечивает высокоуровневый интерфейс к AMI, позволяющий разработчикам контролировать сервер Asterisk из приложений.
В основе документирования клиента лежит материал книги Asterisk: будущее телефонии.
@TODO это из вики, проверить
Перед тем как посылать команды и получать события с сервера, нужно получить сессию(сессии) соединения(соединений) в вашем приложении. В вашем приложении вы получаете объект AsteriskDriver посредством:
$this->pbxDriver = Daemon::$appResolver->getInstanceByAppName('AsteriskDriver');
Соединение ← Использование ← Asterisk ← Клиенты
Далее получаете объект AsteriskDriverSession посредством:
$session = $this->pbxDriver->getConnection();
// или
foreach($this->pbxConnections as $addr => $conn) {
$session = $this->pbxDriver->getConnection($addr);
// что-нибудь делаем...
}
Добавляете (композиция) в него текущий контекст соединения посредством:
$session->context = $this;
При соединении:
$session->onConnected(function(SocketSession $session, $status) {
// ваш код, в зависимости от соединения
});
При разрыве:
$session->onFinish(function(SocketSession $session) {
// возможно запустить интервал реконнекта...
});
Предположим у вас несколько серверов Asterisk с которых вы хотите получать события(events) и на которые вы хотите отправлять команды(actions). Так же вы хотите отслеживать падение соединения(connection failed), и осуществлять реконнект. Смотрите пример реконнекта ниже.
Немного о формате ввода-вывода ← Использование ← Asterisk ← Клиенты
Хотя протокол AMI является строковым, драйвер при вводе-выводе работает с ассоциативными массивами. При получении ответа на действие или события все заголовки и их значения приводятся к нижнему регистру, если значение не содержит информацию, для которой важен регистр - например имя пира.
Отправка команд и получение ответа ← Использование ← Asterisk ← Клиенты
Для отправки команды и получения ответа вы можете воспользоваться либо методом-помощником, который снабжен подробным комментарием из документации Asterisk, либо универсальным методом Connection::action.
В любом случае для каждой команды вы определяете функцию обратного вызова, в которую будет передан объект сессии соединения и ассоциативный массив пар заголовок-значение ответа.
Клиент корректно обрабатывает, что порядок следования пакетов ответа не определен, корректно собирает составные пакеты ответа.
$session->getSipPeers(function(SocketSession $session, array $packet) {
// $session->addr содержит адрес соединения
// $session->context содержит контекст вызова (если был установлен)
// $packet - это массив пар заголовок-значение ответа
// что-нибудь делаем
})
// или
$session->getConfig('chan_dahdi.conf', array($this, 'doSomething'));
public function doSomething(SocketSession $session, array $packet) {
}
// или
$session->action('Ping', function(SocketSession $session, array $packet) {
if($packet['response'] == 'success' && $packet['ping'] == 'pong') {
// успешно сыграли в пинг-понг
}
});
// или
// $channel содержит канал из события
$session->redirect(array(
'Channel' => $channel,
'Context' => 'internal',
'Exten' => '116',
'Priority' => 1
), function(SocketSession $session, array $packet) {
// узнаем успешно или нет из ответа сервера содержащегося в ассоциативном массиве $packet
});
Получение событий сервера ← Использование ← Asterisk ← Клиенты
Функция обратного вызова при наступлении события в данном соединении определяется один раз и передается методу onEvent().
$session->onEvent(array($this, 'onPbxEvent'));
Когда запущено несколько воркеров, чтобы не получилось, что события канала(характеризуются наличием уникального идентификатора(uniqueid) канала) кратны количеству воркеров(workers) можно воспользоваться таблицей блокировки. Вот пример, когда в качестве таблицы блокировки используется MongoDB коллекция(collection), которая позволяет ставить уникальный индекс на документ:
$session->onEvent(array($this, 'onPbxEvent'));
// db.events.ensureIndex({"event": 1, "addr": 1}, {unique: true});
public function onPbxEvent(SocketSession $session, array $event) {
if(method_exists('Foo_PbxEventDispatcher', "{$event['event']}Handler")) {
$handler = "{$event['event']}Handler";
if(isset($event['uniqueid']) || isset($event['uniqueid1'])) {
$appInstance = $this;
$this->db->events->insert(
array(
'ts' => microtime(true),
'event' => $event,
'addr' => $session->addr
),
function($result) use ($appInstance, $session, $event) {
if($result['err'] === null) {
$handler = "{$event['event']}Handler";
Foo_PbxEventDispatcher::$handler($appInstance, $session, $event);
}
}
);
}
else {
Foo_PbxEventDispatcher::$handler($this, $session, $event);
}
}
}
class Foo extends AppInstance {
// ...
public function onInit() {
// pbxConnections - array of connections
foreach($this->pbxConnections as $addr => $conn) {
$pbx_driver_session = $this->pbxDriver->getConnection($addr);
if($pbx_driver_session instanceof SocketSession) {
$pbx_driver_session->context = $this;
//$pbx_driver_session->onError(array($this, 'onPbxError'));
$pbx_driver_session->onConnected(array($this, 'onPbxConnected'));
$pbx_driver_session->onEvent(array($this, 'onPbxEvent'));
$pbx_driver_session->onFinish(array($this, 'onPbxFinish'));
}
else {
$this->runPbxReconnectInterval($pbx_driver_session);
}
}
}
// ...
public function onPbxConnected(SocketSession $session, $status) {
if($status) {
if($session->context instanceof PbxReconnector) {
$session->context->finish();
}
// do something...
}
else {
$this->runPbxReconnectInterval($session);
}
}
// ...
public function onPbxFinish(SocketSession $session) {
$this->runPbxReconnectInterval($session);
}
// ...
public function runPbxReconnectInterval(SocketSession $session) {
if(Daemon::$process->terminated) {
return;
}
foreach ($this->queue as &$r) {
if($r instanceof PbxReconnector) {
if ($r->attrs->addr == $session->addr) {
return;
}
}
}
$interval = $this->pushRequest(new PbxReconnector($this, $this));
$interval->attrs->addr = $session->addr;
}
// ...
}
// ...
class PbxReconnector extends Request {
public $interval = 0.3;
public function run() {
$pbx_driver_session = $this->appInstance->pbxDriver->getConnection($this->attrs->addr);
if($pbx_driver_session) {
if($this->appInstance->config->{'pbxreconnectorlogging'}->value) {
Daemon::log('Reconnecting to ' . $this->attrs->addr);
}
$pbx_driver_session->context = $this;
$pbx_driver_session->onConnected(array($this->appInstance, 'onPbxConnected'));
$pbx_driver_session->onFinish(array($this->appInstance, 'onPbxFinish'));
}
$this->sleep($this->interval);
}
}
namespace PHPDaemon\Clients\Asterisk;
class Pool extends \PHPDaemon\Network\Client;
Опции по-умолчанию ← Класс Pool ← Asterisk ← Клиенты
authtype (string = 'md5')
port (integer = 5280)
Методы ← Класс Pool ← Asterisk ← Клиенты
-
boolean public static getConnection ( callable $cb ) boolean public static getConnection ( string $url = null, callable $cb = null, integer $pri = 0 )
- Выполняет callback-функцию когда будет установлена связь с сервером. Возвращает
false
если соединение невозможно установить $cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет установлена связь с сервером$url
— адрес сервера$pri
— приоритет данного вызова среди других. Чем больше значение, тем выше приоритет
- Выполняет callback-функцию когда будет установлена связь с сервером. Возвращает
namespace PHPDaemon\Clients\Asterisk;
class Connection extends \PHPDaemon\Network\ClientConnection;
Методы ← Класс Connection ← Asterisk ← Клиенты
-
void public getSipPeers ( callable $cb )
- Выводит список сконфигурированных в данный момент равноправных участников SIP с указанием их статуса
Привилегии: system, all $cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Выводит список сконфигурированных в данный момент равноправных участников SIP с указанием их статуса
-
void public getIaxPeers ( callable $cb )
- Выводит список всех равноправных участников IAX2 с указанием их текущего статуса
Привилегии: none $cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Выводит список всех равноправных участников IAX2 с указанием их текущего статуса
-
void public getConfig ( string $filename, callable $cb )
- Извлекает данные из конфигурационного файла Asterisk
Привилегии: config, all $filename
— имя конфигурационного файла, из которого должны извлекаться данные$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Извлекает данные из конфигурационного файла Asterisk
-
void public getConfigJSON ( string $filename, callable $cb )
- Возвращает данные из конфигурационного файла Asterisk в JSON формате
Привилегии: config, all $filename
— имя конфигурационного файла, из которого должны извлекаться данные$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Возвращает данные из конфигурационного файла Asterisk в JSON формате
-
void public setVar ( string $channel, string $variable, string $value, callable $cb )
- Задает значение глобальной переменной или переменной канала
Привилегии: call, all $channel
— канал, для переменной которого задается значение. Если не указан, переменная будет задана как глобальная$variable
— имя переменной$value
— значение$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Задает значение глобальной переменной или переменной канала
-
void public coreShowChannels ( callable $cb )
- Отображает все активные каналы
$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
-
void public status ( callable $cb, string $channel = null )
- Представляет статус одного или более каналов с подробной информацией об их текущем состоянии
Привилегии: call, all $channel
— ограничивает вывод статусом заданного канала$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Представляет статус одного или более каналов с подробной информацией об их текущем состоянии
-
void public redirect ( array $params, callable $cb )
- Перенаправляет канал в новый контекст, добавочный номер и приоритет диалплана
Привилегии: call, all $params
— ассоциативный массив параметров команды$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Перенаправляет канал в новый контекст, добавочный номер и приоритет диалплана
-
void public originate ( array $params, callable $cb )
- Формирует исходящий вызов из Asterisk и соединяет канал с контекстом/добавочным номером/приоритетом или приложением диалплана
Привилегии: call, all $params
— ассоциативный массив параметров команды$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Формирует исходящий вызов из Asterisk и соединяет канал с контекстом/добавочным номером/приоритетом или приложением диалплана
-
void public extensionState ( array $params, callable $cb )
- Сообщает о состоянии заданного добавочного номера. Если добавочный номер имеет подсказку, эта команда обеспечит передачу состояния устройства, соединенного с данным добавочным номером
Привилегии: call, all $params
— ассоциативный массив параметров команды$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
- Сообщает о состоянии заданного добавочного номера. Если добавочный номер имеет подсказку, эта команда обеспечит передачу состояния устройства, соединенного с данным добавочным номером
-
void public ping ( callable $cb )
- Посылает запрос на сервер Asterisk, чтобы убедиться, что он до сих пор отвечает. Asterisk ответит сообщением Pong. Эта команда также может использоваться, чтобы не допустить разрыва соединения в результате истечения времени ожидания
$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
-
void public action ( string $action, callable $cb, array $params = null, array $assertion = null )
- Отправляет на сервер произвольную команду
$action
— команда$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат$params
— ассоциативный массив параметров команды$assertion
— @TODO If more events may follow as response this is a main part or full an action complete event indicating that all data has been sent
-
void public logoff ( callable $cb = null )
- Завершает сеанс
$cb
—callback ( Connection $conn, array $packet )
— вызывается когда будет получен результат
Clients\DNS ← Клиенты
Clients\Gibson ← Клиенты
HTTP ← Клиенты
namespace PHPDaemon\Clients\HTTP;
Предназначен для выполнения GET и POST запросов на удаленные хосты.
Клиент использует пространство имен HTTPRequest.
Получение файла google.com/robots.txt GET запросом:
$httpclient = \PHPDaemon\Clients\HTTP\Pool::getInstance();
$httpclient->get('http://www.google.com/robots.txt',
function ($conn, $success) {
// обработка данных ответа
}
);
Рабочий пример клиента представлен в Clients/HTTP/Examples/Simple.php
namespace PHPDaemon\Clients\HTTP;
class Pool extends \PHPDaemon\Network\Client;
Опции по-умолчанию ← Класс Pool ← HTTP ← Клиенты
port (integer = 80)
ssl-port (integer = 443)
expose (boolean = true)
Методы ← Класс Pool ← HTTP ← Клиенты
-
void public get ( url $url, array $params ) void public get ( url $url, callable $resultcb )
- Осуществляет GET запрос
$url
— запрашиваемый URL$params
— ассоциативный массив параметров запроса$resultcb
—callback ( Connection $conn, boolean $success )
— Вызывается когда на запрос пришел ответ, либо произошла ошибка
-
void public post ( url $url, array $data, array $params ) void public post ( url $url, array $data, callable $resultcb )
- Осуществляет POST запрос
$url
— запрашиваемый URL$data
— ассоциативный массив POST-параметров$params
— ассоциативный массив параметров запроса$resultcb
—callback ( Connection $conn, boolean $success )
— Вызывается когда на запрос пришел ответ, либо произошла ошибка
-
string public static buildUrl ( string $str ) string public static buildUrl ( array $mixed )
- Генерирует URL-кодированную строку запроса из предоставленного ассоциативного (или индексного) массива
$mixed
или возвращает строку$str
. В случае ошибки возвращаетfalse
$mixed
— массив параметров URL
- Генерирует URL-кодированную строку запроса из предоставленного ассоциативного (или индексного) массива
-
string public static parseUrl ( string $str ) string public static parseUrl ( array $mixed )
- Разбирает массив
$mixed
или строку$str
и возвращает ассоциативный массив, содержащий необходимые компоненты URL:[$scheme, $host, $uri, $port]
. В случае ошибки возвращаетfalse
.
См. php.net/parse_url $mixed
— массив параметров URL
- Разбирает массив
namespace PHPDaemon\Clients\HTTP;
class Connection extends \PHPDaemon\Network\ClientConnection;
Свойства ← Класс Connection ← HTTP ← Клиенты
-
array public $headers;
- Заголовки ответа
-
string public $body;
- Тело ответа
-
integer public $contentLength;
- Длина тела ответа
-
string public $cookie;
- Ассоциативный массив Cookies пришедших в ответе
-
boolean public $chunked;
- Если true, то в заголовках был получен `Transfer-Encoding: chunked`
-
integer public $protocolError;
- Если не `:hc`null`, то произошла серьезная ошибка при обработке ответа на запрос. Содержит номер строки в файле Connection.php, по которому можно определить характер ошибки
-
integer public $responseCode;
-
string public $lastURL;
- Последний запрошенный url
-
string public $rawHeaders;
- Заголовки ответа в сыром виде
Методы ← Класс Connection ← HTTP ← Клиенты
-
string public getBody ( )
- Возвращает тело ответа
-
string public getHeaders ( )
- Возвращает ассоциативный массив заголовков ответа
-
string public getHeader ( string $name )
- Возвращает заголовок ответа по имени или
null
$name
— имя заголовка
- Возвращает заголовок ответа по имени или
Clients\ICMP ← Клиенты
Clients\IRC ← Клиенты
Lock ← Клиенты
Требует рефакторинга
Clients\Memcache ← Клиенты
Clients\Mongo ← Клиенты
MySQL ← Клиенты
namespace PHPDaemon\Clients\MySQL;
Клиент для СУБД MySQL
@TODO
В вашем приложении вам следует получать объект MySQLClient посредством Daemon::$appResolver->getInstanceByAppName('MySQLClient')
и использовать как описано ниже.
Подготовка объекта соединения ← Использование ← MySQL ← Клиенты
/*
@method getConnection
@description Establishes connection.
@param string Optional. Address.
@return integer Connection's ID.
*/
Вам следует получить объект MySQLClientSession посредством метода $MySQLClient->getConnection(), затем вы можете положить ваш текущий запрос/сессию/что-нибудь еще в текущий контекст соединения (в свойство context).
Затем используйте:
$this->sql->onConnected(
function($sql, $success) {
if (!$success) {
return;
}
// your connection-dependent code
}
);
$sql->query('SHOW VARIABLES',
function($sql, $success) {
$sql->context->queryResult = $sql->resultRows; // save the result
$sql->context->wakeup(); // wake up the request immediately
}
);
Когда callback-функция вызвана, $sql->context содержит ваш объект, который вы туда положили перед этим. $sql->resultRows хранит результат в виде массива ассоциативных массивов. $sql->resultFields содержит поля ответа в виде массива ассоциативных массивов.
namespace PHPDaemon\Clients\MySQL;
class Pool extends \PHPDaemon\Network\Client;
Опции по-умолчанию ← Класс Pool ← MySQL ← Клиенты
server (string = 'tcp://[email protected]/')
port (integer = 3306)
max-conn-per-serv (integer = 32)
Методы ← Класс Pool ← MySQL ← Клиенты
-
boolean public static getConnection ( callable $cb ) boolean public static getConnection ( string $url = null, callable $cb = null, integer $pri = 0 )
- Выполняет callback-функцию когда будет установлена связь с сервером. Возвращает
false
если соединение невозможно установить $cb
—callback ( Connection $conn )
— вызывается когда будет установлена связь с сервером$url
— адрес сервера$pri
— приоритет данного вызова среди других. Чем больше значение, тем выше приоритет
- Выполняет callback-функцию когда будет установлена связь с сервером. Возвращает
-
string public static escape ( string $string )
- Экранирует специальные символы:
\0
,\n
,\r
,\
,'
,"
$string
— исходная строка
- Экранирует специальные символы:
-
string public static likeEscape ( string $string )
- Работает как метод
Pool::escape
с дополнительными символами:%
и_
$string
— исходная строка
- Работает как метод
-
string public static value ( mixed $mixed )
- Преобразует строку или число
$mixed
для использоания в SQL-выражении и возвращает значение в одинарных кавычках'
. Для всех остальных типов возвращает'null'
$mixed
— конвертируемые данные
- Преобразует строку или число
-
string public static values ( mixed $arr )
- Преобразует массив
$arr
для использоания в SQL-выражении и возвращает список значений, разделенные запятой,
. Для всех остальных типов возвращает пустую строку $mixed
— конвертируемые данные
- Преобразует массив
namespace PHPDaemon\Clients\MySQL;
class Connection extends \PHPDaemon\Network\ClientConnection;
Свойства ← Класс Connection ← MySQL ← Клиенты
-
string public $serverver;
- @TODO
-
string public $serverCaps;
- @TODO
-
string public $serverLang;
- @TODO
-
string public $serverStatus;
- @TODO
-
integer public $warnCount;
- @TODO
-
string public $message;
- @TODO Flags of this MySQL client
-
string public $dbname;
- Текущая база данных
-
array public $resultRows;
- Массив результата SQL-запроса в виде ассоциативных массивов
-
array public $resultFields;
- Массив колонок таблицы в виде ассоциативных массивов
-
string public $context;
- Контекст для выполняемых SQL-запросов
-
integer public $insertId;
- Идентификатор, сгенерированный при последнем INSERT-запросе
-
integer public $affectedRows;
- Число затронутых SQL-запросом строк
-
integer public $protover;
- @TODO
-
integer public $timeout;
- @TODO
-
integer public $errno;
- Численный код ошибки выполнения SQL-запроса
-
string public $errmsg;
- Текст ошибки выполнения SQL-запроса
Методы ← Класс Connection ← MySQL ← Клиенты
-
void public onConnected ( callable $callback )
- Выполняет callback-функцию когда будет установлена связь с сервером
$callback
—callback ( Connection $conn, boolean $success )
— вызывается когда установлена связь с сервером, либо произошла ошибка
-
boolean public query ( string $query, callable $callback = NULL )
- Осуществляет SQL-запрос к серверу
$query
— SQL-запрос$callback
—callback ( Connection $conn, boolean $success )
— вызывается когда получен результат SQL-запроса, либо произошла ошибка
-
boolean public ping ( callable $callback = NULL )
- Проверяет работает ли соединение с сервером. Если оно утеряно, автоматически предпринимается попытка пересоединения
$callback
—callback ( Connection $conn, boolean $success )
— вызывается когда получен результат, либо произошла ошибка
-
boolean public selectDB ( string $name )
- Выбирает базу данных MySQL
$name
— имя выбираемой базы данных
Clients\PostgreSQL ← Клиенты
Clients\Redis ← Клиенты
namespace PHPDaemon\Clients\Redis;
Асинхронный клиент для NoSQL хранилища Redis
Clients\Valve ← Клиенты
Clients\WebSocket ← Клиенты
Clients\XMPP ← Клиенты
Библиотеки
Cache ← Библиотеки
namespace PHPDaemon\Cache;
Механизм локального LRU-кеша ключ-значение.
Используется для кеширования замыканий созданных через create_function. Также используется в Clients\DNS
Класс CappedStorage ← Cache ← Библиотеки
namespace PHPDaemon\Cache;
abstact class CappedStorage;
Базовый абстрактный класс.
Свойства ← Класс CappedStorage ← Cache ← Библиотеки
-
callable public $sorter;
- Метод сортировки
-
integer public $maxCacheSize;
- Максимальное количество элементов в кеше
-
integer public $capWindow;
- Количество элементов, которые пропускаются в кеш сверх максимального количества, для уменьшения количества сортировок
-
array public $cache;
- Ассоциативный массив хранимых элементов
Методы ← Класс CappedStorage ← Cache ← Библиотеки
-
string public hash ( string $key )
- Возвращает хеш ключа, который идентифицирует элемент хранилища, по-умолчанию используется crc32()
$key
— ключ элемента
-
[Item] (#../../item) public put ( string $key, mixed $value, float $ttl = null )
- Добавляет элемент в кеш Item с значением
$value
$key
— ключ элемента$value
— значение$ttl
— время жизни в секундах
- Добавляет элемент в кеш Item с значением
-
void public invalidate ( string $key )
- Удаляет элемент кеша
$key
— ключ
-
[Item] (#../../item) public get ( string $key )
- Возвращает элемент хранилища Item
$key
— ключ
-
mixed public getValue ( string $key )
- Возвращает значение элемента хранилища
$key
— ключ элемента
Класс Item ← Cache ← Библиотеки
namespace PHPDaemon\Cache;
class Item;
Свойства ← Класс Item ← Cache ← Библиотеки
-
integer public $hits;
- Количество обращений к значению элемента
-
integer public $expire;
- Временная метка до которой элемент действителен
Методы ← Класс Item ← Cache ← Библиотеки
-
integer public getHits ( )
- Возвращает количество обращений к значению элемента
-
mixed public getValue ( )
- Возвращает значение элемента
-
void public addListener ( callable $cb )
- Переданная функция обратного вызова будет вызвана когда будет установлено значение элемента
$cb
— функция обратного вызова
-
void public setValue ( mixed $value )
- Устанавливает значение элемента
$value
— значение
Класс CappedStorageHits ← Cache ← Библиотеки
namespace PHPDaemon\Cache;
class CappedStorageHits extends CappedStorage;
Реализация CappedStorage с сортировкой по количеству обращений
ComplexJob ← Библиотеки
namespace PHPDaemon\Core;
class ComplexJob extends \ArrayAccess;
Объект класса ComplexJob позволяет повесить функцию обратного вызова на завершение всех объявленных в нем процедур. Это удобно, когда нужно выполнить ряд независимых цепочек действий.
Примеры ← ComplexJob ← Библиотеки
$j = new ComplexJob(function($j) { // Когда всё выполнилось
D($j['foo']); // this
D($j['foobar']); // is
D($j['bar']); // sparta
});
/* Добавляем задачу */
$j('foo', function($name, $j) {
$j[$name] = 'this'; // Вызываем setResult()
/* Еще задачу */
$j('foobar', function($name, $j) {
$j[$name] = 'is';
});
});
/* И еще одну */
$j('bar', function($name, $j) {
$j[$name] = 'sparta';
});
$j(); // Запускаем
Константы ← ComplexJob ← Библиотеки
-
Состояние: ожидание
- const STATE_WAITING = 1;
-
Состояние: в процессе
- const STATE_RUNNING = 2;
-
Состояние: завершено
- const STATE_DONE = 3;
Свойства ← ComplexJob ← Библиотеки
-
callable public $listeners;
- Стек функций обратного вызова, которые вызываются при успешном выполнении всех объявленных процедур
-
integer public $results;
- Ассоциативный массив результатов установленных через `:h`setResult($value, $value)` или `:h`$job[$name] = $value;`
-
integer public $state;
- Состояние (константа STATE_*)
-
array public $jobs;
- Ассоциативный массив, хранящий функции обратного вызова подзадач
-
array public $resultsNum;
- Количество выполненных подзадач
-
array public $jobsNum;
- Количество подзадач
Методы ← ComplexJob ← Библиотеки
-
void public __construct ( callable $cb = null )
- Конструктор
$cb
— функция обратного вызова для метода addListener
-
void public addListener ( callable $cb )
- Переданная функция будет вызвана когда все подзадачи выполнены
$cb
— функция обратного вызова
-
mixed public offsetExists ( string $j )
- Позволяет сделать
isset($j[$name])
$j
— имя подзадачи
- Позволяет сделать
-
mixed public offsetGet ( string $j )
- Позволяет сделать
isset($job[$name])
$j
— имя подзадачи
- Позволяет сделать
-
mixed public offsetSet ( string $j, mixed $v )
- Позволяет сделать
$job[$name] = $value
$j
— имя подзадачи$v
— значение
- Позволяет сделать
-
mixed public offsetUnset ( string $j )
- Позволяет сделать
unset($job[$name])
$j
— имя подзадачи
- Позволяет сделать
-
array public getResults ( )
- Возвращает ассоциативный массив результатов
-
void public keep ( boolean $keep = true )
- Включает опцию keep, при которой, после выполнения всех подзадач не вызывается метод
cleanup()
$keep
— true/false
- Включает опцию keep, при которой, после выполнения всех подзадач не вызывается метод
-
boolean public hasCompleted ( )
- Выполнены ли все подзадачи?
-
[ComplexJob] (#../) public maxConcurrency ( integer $n = -1 )
- Устанавливает максимальное количество одновременно выполняемых задач
$n
— Натуральное число. При-1
ограничение не действует
-
boolean public setResult ( string $jobname, mixed $result = null )
- Устанавливает результат выполнения подзадачи
$jobname
— Название подзадачи$result
— Результат
-
mixed public getResult ( string $jobname )
- Получить результат выполнения подзадачи по имени
$jobname
— имя подзадачи
-
void public checkQueue ( )
- Вызывается автоматически. Проверяет полна ли очередь и если нет, то пробует запустить еще подзадач из
backlog
иmore
- Вызывается автоматически. Проверяет полна ли очередь и если нет, то пробует запустить еще подзадач из
-
[ComplexJob] (#../) public more ( callable $cb = null )
- Задает функцию обратного вызова, которая автоматически вызывается каждый раз, когда можно добавить еще подзадач
$cb
— функция обратного вызова
-
boolean public isQueueFull ( )
- Проверяет полна ли на данный момент очередь задач (превышен ли параметр
maxConcurrency
)
- Проверяет полна ли на данный момент очередь задач (превышен ли параметр
-
boolean public addJob ( string $name, callable $cb )
- Добавляет подзадачу
$name
— имя подзадачи$cb
— функция обратного вызова
-
void public cleanup ( )
- Удаляет сохраненные результаты и функции обратного вызова. Вызывается автоматически, не задан параметр
keep
. В этом случае, во избежание утечек памяти вызывайте этот метод сами, когда закончили работать с данными
- Удаляет сохраненные результаты и функции обратного вызова. Вызывается автоматически, не задан параметр
-
void public execute ( )
- Выполняет
-
boolean public __invoke ( string $name = null, callable $cb = null )
- Синоним
addJob ( $name, $cb )
. Пример:$job('job', )
- Синоним
-
boolean public __invoke ( )
- Синоним
execute()
. Пример:$job()
- Синоним
ShellCommand ← Библиотеки
namespace PHPDaemon\Core;
class ShellCommand extends \PHPDaemon\Network\IOStream;
Класс является наследником IOStream, так что в нём доступны такие методы как read[ln], write[ln], и так далее.
Примеры ← ShellCommand ← Библиотеки
Простое выполнение, аналог функции shell_exec
ShellCommand::exec('echo "foo"', function($commandInstance, $output) {
D($output); // foo
});
С дополнительными параметрами и переменными окружения
$command = 'git log';
$cb = function($commandInstance, $output) {
D($output); // foo
};
$arguments = ['-1', '--pretty' => 'oneline'];
$env = [];
ShellCommand::exec($command, $cb, $arguments, $env);
Аргументы будут экранированы с помощью
escapeshellarg
Пакетная обработка вывода
@TODO
Свойства ← ShellCommand ← Библиотеки
-
string public $binPath;
- Исполняемый путь
-
string public $setUser;
- Имя Unix-пользователя от имени которого выполняется команда
-
string public $setGroup;
- Имя Unix-группы от имени которого выполняется команда
-
string public $chroot = '/';
- Подмена корневого каталога для выполняемой команды
-
string public $cwd;
- @TODO
Методы ← ShellCommand ← Библиотеки
-
void public static exec ( string $binPath = null, callable $cb = null, array $args = null, array $env = null )
- Выполняет команду (статический метод)
$binPath
— исполняемый путь$cb
— функция обратного вызова$args
— массив аргументов$env
— ассоциативный массив переменных окружения (можно передать $_ENV`)
-
string public getCmd ( )
- Возвращает строку исполняемой команды
-
[ShellCommand] (#../) public setUser ( string $val )
- Задает имя Unix-пользователя от имени которого выполняется команда
$val
— имя пользователя
-
[ShellCommand] (#../) public setGroup ( string $val )
- Задает название Unix-группы от которой выполняется команда
$val
— название группы
-
[ShellCommand] (#../) public setCwd ( string $dir )
- Установить рабочий каталог для выполняемой команды
$dir
— путь
-
[ShellCommand] (#../) public setChroot ( string $dir )
- Подменяет корневой каталог для выполняемой команды
$dir
— путь
-
[ShellCommand] (#../) public setArgs ( array $args = NULL )
- Установить список аргументов
$args
— массив аргументов
-
[ShellCommand] (#../) public setEnv ( array $env = NULL )
- Задает ассоциативный массив переменных окружения (можно передать $_ENV`)
$env
— массив
-
[ShellCommand] (#../) public nice ( integer $nice = NULL )
- Задает приоритет выделения процессорного времени (меньше — выше)
$nice
— целое число
-
string public static buildArgs ( array $args )
- Строит строку аргументов по массиву
$args
— массив аргумент
-
[ShellCommand] (#../) public execute ( string $binPath = NULL, array $args = NULL, array $env = NULL )
- Непосредственно выполняет команду
$binPath
— исполняемый путь$args
— массив аргументов$env
— ассоциативный массив переменных окружения (можно передать $_ENV`)
-
boolean public finishWrite ( )
- Закрывает поток ввода исполняемого процесса, когда буфер будет прочитан
-
void public close ( )
- Завершает процесс
-
[ShellCommand] (#../) public closeWrite ( )
- Безусловно закрывает поток ввода исполняемого процесса (STDIN)
-
boolean public eof ( )
- Достигнут ли EOF (Конец Файла)?
-
[ShellCommand] (#../) public onEOF ( callable $cb = NULL )
- Переданная функция обратного вызова будет вызвана когда достигнут EOF (Конец Файла)
$cb
— функция обратного вызова
Timer ← Библиотеки
namespace PHPDaemon\Core;
class Timer;
С помощью этого класса можно создавать отложенные во времени события (таймеры)
Примеры ← Timer ← Библиотеки
$i = 0;
setTimeout(function($timer) use (&$i) {
D("Пять секунд прошло!");
if (++$i < 3) {
// запуск таймера ещё на 5 секунд
$timer->timeout();
} else {
D('Конец');
$timer->free();
}
}, 5e6);
Глобальные функции ← Timer ← Библиотеки
-
integer setTimeout ( callable $cb, integer $timeout = null, integer $id = null, integer $priority = null )
- Функция-псевдоним
Timer::add
$cb
— функция обратного вызова$timeout
— количество микросекунд через которое должна быть выполнена функция обратного вызова$id
— идентификатор таймера$priority
— приоритет события таймера
- Функция-псевдоним
Свойства ← Timer ← Библиотеки
-
integer public $id;
- Идентификатор таймера
-
integer public $lastTimeout;
- Количество микросекунд на которое был взведен таймер последний раз
-
boolean public $finished = false;
- Завершен ли данный таймер?
-
callable public $cb;
- Функция обратного вызова
-
array public static $list = [];
- Ассоциативный массив всех таймеров
-
integer public $priority;
- Приоритет события данного таймера
Методы ← Timer ← Библиотеки
-
void public __construct ( callable $cb, integer $timeout = null, integer $id = null, integer $priority = null )
- Конструктор
$cb
— функция обратного вызова$timeout
— количество микросекунд через которое должна быть выполнена функция обратного вызова$id
— идентификатор таймера$priority
— приоритет события таймера
-
void public setPriority ( integer $priority )
- @TODO
$priority
— @TODO
-
integer public static add ( callable $cb, integer $timeout = null, integer $id = null, integer $priority = null )
- @TODO
$cb
— @TODO$timeout
— @TODO$id
— @TODO$priority
— @TODO
-
boolean public static setTimeout ( integer $id, integer $timeout = NULL )
- @TODO
$id
— @TODO$timeout
— @TODO
-
void public static remove ( integer $id )
- @TODO
$id
— @TODO
-
void public static cancelTimeout ( integer $id )
- @TODO
$id
— @TODO
-
void public timeout ( integer $timeout = null )
- @TODO
$timeout
— @TODO
-
void public cancel ( )
- @TODO
-
void public finish ( )
- @TODO
-
void public __destruct ( )
- @TODO
-
void public free ( )
- @TODO
TransportContext ← Библиотеки
namespace PHPDaemon\Core;
class TransportContext extends AppInstance;
@TODO
FS ← Библиотеки
namespace PHPDaemon\FS;
Класс FileSystem ← FS ← Библиотеки
namespace PHPDaemon\FS;
class FileSystem;
Свойства ← Класс FileSystem ← FS ← Библиотеки
-
boolean public static $supported;
- @TODO
-
Event public static $ev;
- @TODO
-
resource public static $fd;
- @TODO
-
array public static $modeTypes;
- @TODO
-
integer public static $badFDttl = 5;
- @TODO
-
CappedStorage public static $fdCache;
- @TODO
-
integer public static $fdCacheSize = 128;
- @TODO
-
string public static $eioVer = '1.2.1';
- @TODO
Методы ← Класс FileSystem ← FS ← Библиотеки
-
void public static init ( )
- @TODO
-
void public static initEvent ( )
- @TODO
-
boolean public static checkFileReadable ( string $path )
- @TODO
$path
— @TODO
-
void public static waitAllEvents ( )
- @TODO
-
void public static updateConfig ( )
- @TODO
-
string public static sanitizePath ( string $path )
- @TODO
$path
— @TODO
-
array public static statPrepare ( array $stat )
- @TODO
$stat
— @TODO
-
resource public static stat ( string $path, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static unlink ( string $path, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static rename ( string $path, string $newpath, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$newpath
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static statvfs ( string $path, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static lstat ( string $path, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static realpath ( string $path, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static sync ( callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public static syncfs ( callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public static touch ( string $path, integer $mtime, integer $atime = null, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$mtime
— @TODO$atime
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static rmdir ( string $path, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static mkdir ( string $path, integer $mode, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$mode
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static readdir ( string $path, callable $cb = null, integer $flags, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$flags
— @TODO$pri
— @TODO
-
resource public static truncate ( string $path, integer $offset = 0, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$offset
— @TODO$cb
— @TODO$pri
— @TODO
-
boolean public static sendfile ( mixed $outfd, string $path, callable $cb, callable $startCb = null, integer $offset = 0, integer $length = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$outfd
— @TODO$path
— @TODO$cb
— @TODO$startCb
— @TODO$offset
— @TODO$length
— @TODO$pri
— @TODO
-
resource public static chown ( string $path, integer $uid, integer $gid = -1, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$uid
— @TODO$gid
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public static readfile ( string $path, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$pri
— @TODO
-
void public static readfileChunked ( string $path, callable $cb, callable $chunkcb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$cb
— @TODO$chunkcb
— @TODO$pri
— @TODO
-
string public static genRndTempnam ( string $dir = null, string $prefix = 'php' )
- @TODO
$dir
— @TODO$prefix
— @TODO
-
string public static genRndTempnamPrefix ( string $dir, string $prefix )
- @TODO
$dir
— @TODO$prefix
— @TODO
-
void public static tempnam ( string $dir, string $prefix, callable $cb )
- @TODO
$dir
— @TODO$prefix
— @TODO$cb
— @TODO
-
resource public static open ( string $path, string $flags, callable $cb, integer $mode = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$path
— @TODO$flags
— @TODO$cb
— @TODO$mode
— @TODO$pri
— @TODO
Класс File ← FS ← Библиотеки
namespace PHPDaemon\FS;
class File;
Свойства ← Класс File ← FS ← Библиотеки
-
integer public priority = 10;
- @TODO
-
integer public $chunkSize = 4096;
- @TODO
-
integer public $offset = 0;
- @TODO
-
string public $fdCacheKey;
- @TODO
-
boolean public $append;
- @TODO
-
string public $path;
- @TODO
-
boolean public $writing = false;
- @TODO
-
boolean public $closed = false;
- @TODO
Методы ← Класс File ← FS ← Библиотеки
-
void public __construct ( resource $fd, string $path )
- @TODO
$fd
— @TODO$path
— @TODO
-
resource public getFd ( )
- @TODO
-
mixed public static convertFlags ( string $mode, boolean $text = false )
- @TODO
$mode
— @TODO$text
— @TODO
-
resource public truncate ( integer $offset = 0, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$offset
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public stat ( callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public statRefresh ( callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public statvfs ( callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public sync ( callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public datasync ( callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public write ( string $data, callable $cb = null, integer $offset = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$data
— @TODO$cb
— @TODO$offset
— @TODO$pri
— @TODO
-
resource public chown ( integer $uid, integer $gid = -1, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$uid
— @TODO$gid
— @TODO$cb
— @TODO$pri
— @TODO
-
resource public touch ( integer $mtime, integer $atime = null, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$mtime
— @TODO$atime
— @TODO$cb
— @TODO$pri
— @TODO
-
void public clearStatCache ( )
- @TODO
-
boolean public read ( integer $length, integer $offset = null, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$length
— @TODO$offset
— @TODO$cb
— @TODO$pri
— @TODO
-
boolean public sendfile ( mixed $outfd, callable $cb, callable $startCb = null, integer $offset = 0, integer $length = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$outfd
— @TODO$cb
— @TODO$startCb
— @TODO$offset
— @TODO$length
— @TODO$pri
— @TODO
-
resource public readahead ( integer $length, integer $offset = null, callable $cb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$length
— @TODO$offset
— @TODO$cb
— @TODO$pri
— @TODO
-
boolean public readAll ( callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$pri
— @TODO
-
resource public readAllChunked ( callable $cb = null, callable $chunkcb = null, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$cb
— @TODO$chunkcb
— @TODO$pri
— @TODO
-
string public __toString ( )
- @TODO
-
void public setChunkSize ( integer $n )
- @TODO
$n
— @TODO
-
resource public seek ( integer $offset, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- @TODO
$offset
— @TODO$cb
— @TODO$pri
— @TODO
-
integer public tell ( )
- @TODO
-
resource public close ( )
- @TODO
-
void public __destruct ( )
- @TODO
Класс FileWatcher ← FS ← Библиотеки
namespace PHPDaemon\FS;
class FileWatcher;
Свойства ← Класс FileWatcher ← FS ← Библиотеки
-
array public files = [];
- @TODO
-
resource public $inotify;
- @TODO
-
array public $descriptors = [];
- @TODO
Методы ← Класс FileWatcher ← FS ← Библиотеки
-
void public __construct ( )
- @TODO
-
boolean public addWatch ( string $path, mixed $subscriber, integer $flags = NULL )
- @TODO
$path
— @TODO$subscriber
— @TODO$flags
— @TODO
-
boolean public rmWatch ( string $path, mixed $subscriber )
- @TODO
$path
— @TODO$subscriber
— @TODO
-
void public onFileChanged ( string $path )
- @TODO
$path
— @TODO
-
void public watch ( )
- @TODO
PubSub ← Библиотеки
namespace PHPDaemon\PubSub;
Класс PubSub ← PubSub ← Библиотеки
namespace PHPDaemon\PubSub;
class PubSub;
Методы ← Класс PubSub ← PubSub ← Библиотеки
-
boolean public eventExists ( string $id )
- @TODO
$id
— @TODO
-
[PubSubEvent] (#../../pubsubevent) public sub ( string $id, object $obj, callable $cb )
- @TODO
$id
— @TODO$obj
— @TODO$cb
— @TODO
-
void public addEvent ( string $id, PubSubEvent $obj )
- @TODO
$id
— @TODO$obj
— @TODO
-
void public removeEvent ( string $id )
- @TODO
$id
— @TODO
-
[PubSubEvent] (#../../pubsubevent) public unsub ( string $id, object $obj )
- @TODO
$id
— @TODO$obj
— @TODO
-
[PubSubEvent] (#../../pubsubevent) public pub ( string $id, mixed $data )
- @TODO
$id
— @TODO$data
— @TODO
-
boolean public unsubFromAll ( object $obj )
- @TODO
$obj
— @TODO
Класс PubSubEvent ← PubSub ← Библиотеки
namespace PHPDaemon\PubSub;
class PubSubEvent extends \SplObjectStorage;
Свойства ← Класс PubSubEvent ← PubSub ← Библиотеки
-
array public $sub = [ ];
- @TODO
-
callable public $actCb;
- @TODO
-
callable public $deactCb;
- @TODO
Методы ← Класс PubSubEvent ← PubSub ← Библиотеки
-
void public __construct ( callable $act = null, callable $deact = null )
- @TODO
$act
— @TODO$deact
— @TODO
-
[PubSubEvent] (#../) public onActivation ( callable $cb )
- @TODO
$cb
— @TODO
-
[PubSubEvent] (#../) public onDeactivation ( callable $cb )
- @TODO
$cb
— @TODO
-
[PubSubEvent] (#../) public static init ( )
- @TODO
-
[PubSubEvent] (#../) public sub ( object $obj, callable $cb )
- @TODO
$obj
— @TODO$cb
— @TODO
-
[PubSubEvent] (#../) public unsub ( object $obj )
- @TODO
$obj
— @TODO
-
[PubSubEvent] (#../) public pub ( mixed $data )
- @TODO
$data
— @TODO
SockJS ← Библиотеки
namespace PHPDaemon\SockJS;
Класс Application ← SockJS ← Библиотеки
namespace PHPDaemon\SockJS;
class Application extends \PHPDaemon\Core\AppInstance;
С помощью этого класса можно создавать SockJS сервера. SockJS - это простой протокол и клиент/сервер набор библиотек, на базе которых строиться реал-тайм веб приложения, где браузер автоматически выбирает транспортный протокол, базируясь на возможностях конкретного клиента (обеспечивается совместимость начиная с IE6+). При этом, с точки зрения API, разработчик получает практически полную совместимость с WebSocket API.
Детальнее:
- Клиентская библиотека sockjs-client (текущая версия 1.0.3, устаревшая стабильная - 0.3.4) https://github.com/sockjs/sockjs-client
- Описание протокола SockJS - https://github.com/sockjs/sockjs-protocol
Работа с любыми другими протоколами, кроме WebSocket, требует наличия Redis-сервера (при старте приложение попытается создать дефолтное соединение с localhost:6379, для отдельных настроек в конфигурации приложения можно задать свой пул соединений).
Методы ← Класс Application ← SockJS ← Библиотеки
-
public function getLocalSubscribersCount ( $chan )
- @DESC
$params
— params
-
public function subscribe ( $chan, $cb, $opcb = null )
- @DESC
$params
— params
-
public function setnx ( $key, $value, $cb = null )
- @DESC
$params
— params
-
public function setkey ( $key, $value, $cb = null )
- @DESC
$params
— params
-
public function getkey ( $key, $cb = null )
- @DESCNS
$params
— params
-
public function expire ( $key, $seconds, $cb = null )
- @DESC
$params
— params
-
public function unsubscribe ( $chan, $cb, $opcb = null )
- @DESC
$params
— params
-
public function unsubscribeReal ( $chan, $opcb = null )
- @DESC
$params
— params
-
public function publish ( $chan, $cb, $opcb = null )
- @DESC
$params
— params
-
public function onReady ( )
- @DESCспользуется в DNS
$params
— params
-
public function onFinish ( )
- @DESCпользуется в DNS
$params
— params
-
public function attachWss ( $wss )
- @DESCуется в DNS
$params
— params
-
public function wsHandler ( $ws, $path, $client, $state )
- @DESC
$params
— params
-
public function detachWss ( $wss )
- @DESCуется в DNS
$params
— params
-
public function beginSession ( $path, $sessId, $server )
- @DESC
$params
— params
-
public function getRouteOptions ( $path )
- @DESC DNS
$params
— params
-
public function endSession ( $session )
- @DESC в DNS
$params
— params
-
public function beginRequest ( $req, $upstream )
- @DESC
$params
— params
-
public function callMethod ( $method, $req, $upstream )
- @DESC
$params
— params
Приложения
MongoNode ← Приложения
namespace PHPDaemon\Examples;
class MongoNode;
Это приложение предоставляет узел репликации MongoDB. Это дает возможность устанавливать произвольные хуки на добавление/изменение/удаление объектов.
Требования ← MongoNode ← Приложения
Требуется установленный модуль pecl/mongo и включенный phpdaemon/MongoCllient.
Использование ← MongoNode ← Приложения
Когда MongoNode включено, оно незамедлительно получает новые изменения в базе.
По-умолчанию:
Если объект обладает свойством “_key” сериализованное его значение отправляется в ключ Memcache под тем названием, которое задано в значении _key. Когда объект удаляется из MongoDB, он удаляется и из Memcache.
Если объект имеет свойство “_ev”, его значение отправляется в RTEP-событие под тем названием, которое задано в значении _ev.
TelnetHoneypot ← Приложения
namespace PHPDaemon\Examples;
class TelnetHoneypot;
Это приложение предоставляет простой telnet сервер для phpDaemon.
Использование ← TelnetHoneypot ← Приложения
[root@gf-home-server phpdaemon.wiki]# telnet 127.0.0.1 23
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
ping
pong
ServerStatus ← Приложения
namespace PHPDaemon\Applications;
class ServerStatus;
Это приложение обеспечивает получение информации о состоянии phpDaemon по протоколу HTTP, аналогично консольной команде phpd fullstatus
.
Использование ← ServerStatus ← Приложения
Необходимо добавить в conf/phpd.conf
:
ServerStatus {
enable 1;
}
HTTP {
enable 1;
privileged;
}
Также в conf/AppResolver.php
в методе getRequestRoute()
добавить условие для запуска метода beginRequest()
в приложении ServerStatus. Например, чтобы получить информацию о phpDaemon по адресу http://
/**
* Routes incoming request to related application. Method is for overloading.
* @param object Request.
* @param object AppInstance of Upstream.
* @return string Application's name.
*/
public function getRequestRoute($req, $upstream) {
if (preg_match('~^/(ServerStatus|Example)/~', $req->attrs->server['DOCUMENT_URI'], $m)) {
return $m[1];
}
}
Пример ответа:
Uptime: 1 day. 11 hour. 33 min. 51 sec.
State of workers:
Total: 4
Idle: 4
Busy: 0
Shutdown: 20
Pre-init: 0
Wait-init: 0
Init: 0
Примечание ← ServerStatus ← Приложения
Если вы используете опцию --logworkersetstatus, то соответствие такое:
- 1 - idle
- 2 - busy
- 3 - shutdown
- 4 - pre-init
- 5 - wait-init
- 6 - init
Утилиты
Binary ← Утилиты
namespace PHPDaemon\Utils;
class Binary;
Данный класс предоставляет набор статических методов для работы с бинарными данными.
-
string public static labels ( string $q )
- Возвращает структуру имен. Используется в DNS
$q
— Список имен через точку
-
string public static parseLabels ( string &$data, string $orig = null )
- азбирает структуру имен. Используется в DNS
&$data
— Структура$orig
— Изначальный пакет данных для обработки ссылок на подстроки
-
string public static LV ( string $str, integer $len = 1, boolean $lrev = false )
- Возвращает структуру Длина-Значение
$str
— Значение$len
— Количество байтов для записи длины$lrev
— Если true, то Little-Endian
-
string public static LVnull ( string $str )
- Возвращает структуру Длина-Значение с Little-Endian размером длины в два байта и NUL-байтом после строки
$str
— Значение
-
string public static byte ( integer $int )
- Кодирует целое число в один байт
$int
— Число от 0 до 255
-
string public static word ( integer $int )
- Кодирует целое число в два байта
$int
— Целое от 0 до 65535
-
string public static wordl ( integer $int )
- Кодирует целое число в два байта Little-Endian
$int
— Целое от 0 до 65535
-
string public static dword ( integer $int )
- Кодирует целое число в четыре байта
$int
— Целое от 0 до 4294967295
-
string public static dwordl ( integer $int )
- Кодирует целое число в четыре байта Little-Endian
$int
— Целое от 0 до 4294967295
-
string public static qword ( integer $int )
- Кодирует целое число в восемь байт
$int
— Целое от 0 до 18446744073709551615
-
string public static qwordl ( integer $int )
- Кодирует целое число в восемь байт Little-Endian
$int
— Целое от 0 до 18446744073709551615
-
integer public static getByte ( string &$p )
- Удаляет первый байт из строки и возвращает его в виде целого числа от 0 до 255
&$p
— Строка
-
string public static getChar ( string &$p )
- Удаляет первый байт из строки и возвращает его в виде строки
&$p
— Строка
-
integer public static getWord ( string &$p, boolean $l = false )
- Удаляет первые два байта из строки и возвращает их в виде целого числа от 0 до 65535
&$p
— Строка$l
— Если true, то Little-Endian
-
string public static getStrWord ( string &$p, boolean $l = false )
- Удаляет первые два байта из строки и возвращает их
&$p
— Строка$l
— Если true, то Little-Endian
-
integer public static getDWord ( string &$p, boolean $l = false )
- Удаляет первые четыре байта из строки и возвращает их в виде целого от 0 до 4294967295
&$p
— Строка$l
— Если true, то Little-Endian
-
integer public static getQword ( string &$p, boolean $l = false )
- Удаляет первые восемь байт из строки и возвращает их в виде целого от 0 до 18446744073709551615
&$p
— Строка$l
— Если true, то Little-Endian
-
string public static getStrQWord ( string &$p, boolean $l = false )
- Удаляет первые восемь байт из строки и возвращает их в виде строки
&$p
— Строка$l
— Если true, то Little-Endian
-
string public static getString ( string &$str )
- Возвращает подстроку до первого NUL-байта и удаляет её из исходной вместе с NUL-байтом
&$str
— Строка
-
string public static getLV ( string &$p, boolean $l = 1, boolean $nul = false, boolean $lrev = false )
- Разбирает пару Длина-Значение, удаляет её из начала исходной строки и возвращает значение
&$p
— Строка$l
— Количество байтов для записи длины$nul
— Если true, то воспринимать как NUL-завершенную строку$lrev
— Если true, то Little-Endian
-
string public static flags2bitarray ( array $flags, integer $len = 4 )
- Кодирует массив флагов (числа должны быть степенями двойки – 2, 4, 16, 32...)
$flags
— массив чисел$len
— Количество байтов на выходе
-
string public static int2bytes ( integer $len, integer $int = 0, boolean $l = false )
- Кодирует целое число
$len
— Количество байтов на выходе$int
— Целое число$l
— Если true, то Little-Endian
-
string public static i2b ( integer $len, integer $int = 0, boolean $l = false )
- Псевдоним метода
int2bytes
- Псевдоним метода
-
integer public static bytes2int ( string $str, boolean $l = false )
- Конвертирует строку в целое число
$str
— Строку$l
— Если true, то Little-Endian
-
integer public static b2i ( string $str, boolean $l = false )
- Псевдоним метода
bytes2int
- Псевдоним метода
-
string public static bitmap2bytes ( string $bitmap, integer $check_len = 0 )
- Конвертирует побитовое представление в массив байтов
$bitmap
— Строка состоящая из 1 и 0$check_len
— Ожидаемое количество байт на выходе, при несовпадении будет возвращено false
-
string public static getbitmap ( string $byte )
- Получить побитовое представление в виде строки из 1 и 0
$byte
— Строка из одного байта
Crypt ← Утилиты
namespace PHPDaemon\Utils;
class Crypt;
Данный класс содержит методы, относящиеся к криптографии.
-
string public static hash ( string $str, string $salt = '', boolean $plain = false )
- Возвращает хеш строки по алгоритму Keccak
$str
— исходная строка$salt
— примесь для хеширования$plain
— еслиfalse
то результат будет закодирован в base64
-
string public static randomString ( integer $len = 64, string $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-.' )
- Генерирует псевдослучайную строку длиной
$len
из представленных в$chars
символов $len
— длина выходной строки$chars
— набор используемых символов
- Генерирует псевдослучайную строку длиной
-
boolean public static compareStrings ( string $a, string $b )
- Сравнение строк устойчивое к атаке по времени (англ. Timing attack)
$a, $b
— Строки для сравнения
DateTime ← Утилиты
namespace PHPDaemon\Utils;
class DateTime extends \DateTime;
В конструтор можно передавать метку времени Unix.
-
string public static diffAsText ( mixed $datetime1, mixed $datetime2, boolean $absolute = false )
- Возвращает разницу двух временных меток в виде строки. Пример:
1 year. 2 mon. 6 day. 4 hours. 21 min. 10 sec.
$datetime1, $datetime2
— временные метки. Может быть объектом DateTimeInterface, строкой или меткой времени Unix$absolute
— используется, чтобы вернуть абсолютную разницу
- Возвращает разницу двух временных меток в виде строки. Пример:
Encoding ← Утилиты
namespace PHPDaemon\Utils;
class Encoding;
Сторонняя библиотека — forceutf8
-
string public static toUTF8 ( string $text )
- Приводит текст к UTF-8
$text
— Текст
-
string public static toWin1252 ( string $text )
- Приводит к текст к Windows-1251
$text
— Текст
-
string public static toISO8859 ( string $text )
- Приводит к текст к ISO-8859
$text
— Текст
-
string public static toLatin1 ( string $text )
- Приводит к текст к Windows-1251
$text
— Текст
-
string public static fixUTF8 ( string $text )
- Исправляет UTF-8
$text
— Текст
-
string public static UTF8FixWin1252Chars ( string $text )
- Исправляет UTF-8 после конвертации из Windows-1252 так, будто это была ISO-8859
$text
— Текст
-
string public static removeBOM ( string $str = "" )
- Удаляет Byte-order mark
$str
— Текст
-
string public static normalizeEncoding ( string $encodingLabel )
- Приводит название кодировки к стандартной записи
$encodingLabel
— Название кодировки
IRC ← Утилиты
namespace PHPDaemon\Utils;
class IRC;
Класс используемый в IRC-клиенте и IRC-баунсере
-
string public static getCommandByCode ( integer $code )
- Возвращает строковое представление команды по её коду
$code
— код команды
-
string public static getCodeByCommand ( string $cmd )
- Возвращает код команды по её строковому представлению
$cmd
— строковое представление команды
-
string public static parseUsermask ( string $mask )
- Возвращает ассоциативный массив вида {nick: string, unverified: bool, user: string, host: string, orig: string}
$mask
— маска видаnick!~?user@host
MIME ← Утилиты
namespace PHPDaemon\Utils;
class MIME;
-
string public static get ( string $path )
- Возвращает MIME-заголовок файла или
false
$path
— путь до файла
- Возвращает MIME-заголовок файла или
ShmEntity ← Утилиты
namespace PHPDaemon\Utils;
class ShmEntity;
Эластичное хранилище кучи в разделяемой памяти
Используется для хранения массива состояний рабочих процессов
-
string public __construct ( string $path, integer $segsize, string $name, boolean $create = false )
- Конструктор
$path
— путь до файла$segsize
— размер сегмента$name
— название$create
— флаг создания сегмента
-
string public open ( integer $segno = 0, boolean $create = false )
- Открывает сегмент разделяемой памяти
$segno
— номер сегмента$create
— флаг создания сегмента
-
string public getSegments ( )
- Возвращает индексный массив всех сегментов
-
string public openall ( )
- Открывает все сегменты
-
string public write ( string $data, integer $offset )
- Записывает данные
$data
со смещением$offset
$data
— данные$offset
— смещение
- Записывает данные
-
string public read ( integer $offset, integer $length = 1 )
- Считывает данные длиной
$length
со смещением$offset
$offset
— смещение$length
— длина читаемых данных
- Считывает данные длиной
-
string public delete ( )
- Удаляет все сегменты
Terminal ← Утилиты
namespace PHPDaemon\Utils;
class Terminal;
Данный класс нуждается в доработке: не хватает полноценной поддержки ncurses.
Если хотите помочь, нажмите на кота!
-
string public readln ( )
- @TODO
-
void public enableColor ( boolean $bool = true )
- @TODO
$bool
— @TODO
-
void public clearScreen ( )
- @TODO
-
void public setStyle ( string $c )
- @TODO
$c
— @TODO
-
void public resetStyle ( )
- @TODO
-
void public drawParam ( string $name, string $description, array $values = '' )
- @TODO
$name
— @TODO$description
— @TODO$values
— @TODO
-
void public drawTable ( array $rows )
- @TODO
$rows
— @TODO
Структуры
ObjectStorage ← Структуры
namespace PHPDaemon\Structures;
class ObjectStorage extends \SplObjectStorage;
Данный класс предоставляет хранилище объектов с несколькими дополнительными методами
Можно создавать классы-наследники
Методы ← ObjectStorage ← Структуры
-
integer public each ( string $method, mixed ...$args )
- Проходит по всем объектам, вызывая у каждого из них метод
$method
c заданными аргументами$args
и возвращает количество объектов в хранилище $method
— вызываемый метод объекта...$args
— аргументы
- Проходит по всем объектам, вызывая у каждого из них метод
-
void public removeAll ( object $obj = null )
- Удаляет из текущего контейнера все объекты, которых нет в контейнере
$obj
$obj
— контейнер, содержащий элементы, которые должны остаться в текущем контейнере
- Удаляет из текущего контейнера все объекты, которых нет в контейнере
-
object public detachFirst ( )
- Возвращает первый объект, удалив его из контейнера
-
object public getFirst ( )
- Возвращает первый объект контейнера
PriorityQueueCallbacks ← Структуры
namespace PHPDaemon\Structures;
class PriorityQueueCallbacks extends \SplPriorityQueue;
Используется в Network/Client для хранения вызовов, пока все доступные соединения заняты
Методы ← PriorityQueueCallbacks ← Структуры
-
void public enqueue ( callable $cb, integer $pri = 0 )
- Добавляет функцию обратного вызова в очередь и пересортирует её
$cb
— функция обратного вызова$pri
— приоритет
-
void public insert ( callable $cb, integer $pri = 0 )
- Псевдоним метода
enqueue
- Псевдоним метода
-
CallbackWrapper public dequeue ( )
- Извлекает функцию обратного вызова из начала очереди и пересортирует её. Псевдоним метода
SplPriorityQueue::extract
- Извлекает функцию обратного вызова из начала очереди и пересортирует её. Псевдоним метода
-
boolean public executeOne ( mixed ...$args )
- Извлекает первую из начала очереди функцию обратного вызова и выполняет её с переданными аргументами. Возвращает
false
если очередь пуста ...$args
— аргументы
- Извлекает первую из начала очереди функцию обратного вызова и выполняет её с переданными аргументами. Возвращает
-
integer public executeAll ( mixed ...$args )
- Извлекает и выполняет все функции обратного вызова в очереди с переданными аргументами. Возвращает количество выполненных функций обратного вызова
...$args
— аргументы
StackCallbacks ← Структуры
namespace PHPDaemon\Structures;
class StackCallbacks extends \SplStack;
Данный класс предоставляет стек функций обратного вызова с несколькими дополнительными методами
Используется в Network/Client для хранения стека функций обратного вызова запросов
Методы ← StackCallbacks ← Структуры
-
void public push ( callable $cb )
- Добавляет функцию обратного вызова в конец стека
$cb
— функция
-
void public unshift ( callable $cb )
- Добавляет функцию обратного вызова в начало стека
$cb
— функция
-
boolean public executeOne ( mixed ...$args )
- Извлекает первую функцию обратного вызова из начала стека и выполняет её с переданными аргументами. Возвращает
false
если стек пуст ...$args
— аргументы
- Извлекает первую функцию обратного вызова из начала стека и выполняет её с переданными аргументами. Возвращает
-
boolean public executeAndKeepOne ( mixed ...$args )
- Выполяет первую функцию обратного вызова из начала стека с переданными аргументами без извлечения её из стека. Возвращает
false
если стек пуст ...$args
— аргументы
- Выполяет первую функцию обратного вызова из начала стека с переданными аргументами без извлечения её из стека. Возвращает
-
integer public executeAll ( mixed ...$args )
- Извлекает все функции обратного вызова и выполняет с заданными аргументами. Возвращает количество выполненных функций
...$args
— аргументы
-
array public toArray ( )
- Возвращает индексный массив стека
-
void public reset ( )
- Удаляет все элементы из стека
Примеси
Примеси (англ. traits).
Данный раздел описывает доступные для разработчиков встроенные примеси.
ClassWatchdog ← Примеси
namespace PHPDaemon\Traits;
trait ClassWatchdog;
Данная примесь уже использована во всех базовых классах и при наследовании от них не нужно использовать её повторно.
Эта примесь нужна, чтобы предотвратить появление ошибки уровня E_ERROR (Fatal error) при обращении к несуществующему методу. E_ERROR же прерывает работу всего рабочего процесса, что недопустимо в реалиях phpDaemon. Настоятельно рекомендуется к использованию во всех используемых классах.
Определены следующие магические методы:
__call
— бросает исключение UndefinedMethodCalled__callStatic
— бросает исключение UndefinedMethodCalled
StaticObjectWatchdog ← Примеси
namespace PHPDaemon\Traits;
trait StaticObjectWatchdog;
Данная примесь уже использована во всех базовых классах и при наследовании от них не нужно использовать её повторно.
PHP-машина умеет хранить набор свойств объекта двумя способами: в виде фиксированного массива и в виде ассоциативной таблицы (англ. hash table) с использованием B-дерева. Изначально, при создании любого объекта, свойства хранятся в виде массива с быстрым доступом. При первой попытке установить значение свойства не объявленного директивой visibility $name
, набор свойств конвертируется в ассоциативную таблицу. То же самое происходит при удалении (unset) любого свойства). Данная операция сама по себе не самая быстрая, особенно при большом количестве свойств), но и доступ к свойствам после неё замедляется. Разумеется, есть объекты с намеренно динамическим набором свойств, которые сродни ассоциативным массивам и с ними всё в порядке. Но часто бывает так, что программист забывает добавить объявление свойства или даже опечатывается в его названии. Порой это ведёт к сильному ухудшению производительности, которое трудно расследовать.
Прежде чем говорить, что PHP медленный, неплохо бы научиться его готовить.
Данная примесь определяет следующие магические методы:
__set
— пишет в журнал с префиксом[CODE WARN]
при попытке записать значение несуществующего или недоступного из этой области видимости свойства.__unset
— пишет в журнал с префиксом[CODE WARN]
при попытке удалить свойство.
StrictStaticObjectWatchdog ← Примеси
namespace PHPDaemon\Traits;
trait StrictStaticObjectWatchdog;
Поведение аналогично StaticObjectWatchdog, но эта примесь бросает исключение, вместо записи в журнал.
Определяет следующие магические методы:
__set
— бросает исключение UndefinedPropertySetting при попытке записать значение несуществующего или недоступного из этой области видимости свойства.__unset
— бросает исключение UnsettingProperty при попытке удалить свойство.
DeferredEventHandlers ← Примеси
namespace PHPDaemon\Traits;
trait DeferredEventHandlers;
Данная примесь реализует механизм отложенных событий в объекте.
class MyClass {
use \PHPDaemon\Traits\DeferredEventHandlers;
protected function onSomethingEvent($foo, $bar) {
return function($ev) {
list ($foo, $bar = $ev->args;
$ev->setResult("Foo is $foo, bar is $bar");
};
}
}
$o = new MyClass;
$o->onSomething(function($ev) {
D($ev->result);
// Foo is fooo, bar is barr
}, 'foo', 'barr');
$o->onSomething(function($ev) {
D($ev->result);
// Foo is fooo, bar is barr
});
При этом когда результат уже установлен, производящее его замыкание не будет вызвано повторно. Не нужно беспокоиться о повторном вызове еще до того как результат установлен, ожидающие замыкания будут вызваны правильно.
EventHandlers ← Примеси
namespace PHPDaemon\Traits;
trait EventHandlers;
Данная примесь реализует простой механизм PUB/SUB для объекта.
class MyClass {
use \PHPDaemon\Traits\EventHandlers;
}
$o = new MyClass;
$o->on('smth', function($o, $foo, $bar) {
D("Foo is $foo, bar is $bar");
});
$o->trigger('smth', 'foo', 'barr');
Не забывайте о том, что при удалении такого объекта необходимо вызвать метод
cleanupEventHandlers()
, чтобы избежать утечек памяти.
Sessions ← Примеси
namespace PHPDaemon\Traits;
trait Sessions;
Эта примесь реализует механизм сессий, именно реализует, а не является оберткой над session_*
функциями.
Почему мы не можем использовать нативный механизм сессий PHP?
- Проблема №1: В долго живущих процессах(обслуживающих больше одного клиента) суперглобальный массив
$_SESSION
не будет создаваться заново. - Проблема №2: Нативная реализация сессий является блокируюей, что расходится с идеологией PhpDaemon - обеспечить неблокирующий I/O.
Как и нативная реализация, поведение сессий основывается на php.ini
.
Текущая реализация поддерживает хранение сессий в файлах, session.serialize_handler = php|php_binary
, lock r+!
файлов - аналогичный нативному - для предотвращения race condition.
Вы можете безопасно использовать PhpDaemon c существующими сессиями, сериализация совместима с нативной (См. session_encode, session_decode).
Пример использования:
$this->onSessionStart(function ($event) {
if (!$event->getResult()) {
//Session open failed
}
//Session open succeed
});
Данная примесь используется в HTTPRequest и Servers\WebSocket\Route
DNode ← Примеси
trait \PHPDaemon\WebSocket\Traits\DNode
Данная примесь применима в классах-наследниках Servers\WebSocket\Route
Примесь реализует серверную часть протокола DNode, который служит для Удалённого вызова процедур (RPC).
Для подключение примеси нужно внести use \PHPDaemon\WebSocket\Traits\DNode
в определение своего класса-наследника Servers\WebSocket\Route.
Затем необходимо определить методы, доступные клиенту. Фактически это делает метод defineLocalMethods, который должен вызываться в onHandshake.
Давайте, для примера, создадим метод dummy
с аргументами $foo
, $bar
и $callback
:
protected function dummyMethod($foo, $bar, $callback) {
if (!static::ensureCallback($callback)) {
/* $callback не содержит функцию обратного вызова */
return;
}
$callback(md5($foo ^ $bar));
}
При обращении dummy('Hello', 'World', function(result) {...})
ответом будет вызов этой функции с аргументом bd7815679056a50c3f545b159ce5e385
— результатом выполнения md5('Hello' ^ 'World')
В качестве аргументов можно передавать передавать собственные функции обратного вызова, но учтите, что они удаляются из памяти после вызова, если возвратное значение не является true
. Таким образом, следует понимать ожидается ли повторный вызов, и в этом случае возвращать true
. Это делается во избежание утечек памяти.
Для вызова удаленного метода по имени, используйте callRemote.
Как вы могли заметить, пример
dummyMethod
использует вызовstatic::ensureCallback($callback)
. Всегда нужно проверять переданный аргумент с помощью ensureCallback перед его исполнением. В противном случае, это обернётся серьёзной брешью безопасности.
-
void public onHandshake ( )
- Default onHandshake() method
-
[DNode] (#../) public callLocal ( )
- Вызывает локальный метод
-
void protected extractCallbacks ( array &$args, array &$list, array &$path )
- Извлекает функции обратного вызова из массива аргуметнов
&$args
— Аргументы&$list
— Выходной массив для свойства 'callbacks'&$path
— Текущий путь
-
[DNode] (#../) public callRemote ( )
- Вызов удаленного метода
-
[DNode] (#../) public callRemoteArray ( string $method, array $args )
- Вызов удаленного метода с передачей аргументов массивом
$method
— Название метода$args
— Аргументы
-
void protected methodsMethod ( array $methods )
- Обработчик метода
methods
$methods
— Ассоциативный массив методов
- Обработчик метода
-
void public toJsonDebugResursive ( mixed &$m )
- Обработчик рекурсии для метода toJsonDebug
&$m
— Значение
-
string string public toJsonDebug ( mixed $m )
- Возвращает JSON-представление массива в отладочных целях
$m
— Значение
-
void public onFinish ( )
- Вызывается когда сессия завершена
-
void public cleanup ( )
- Очищает внутренние структуры
-
mixed public __call ( string $m, array $args )
- Магический метод __call
$m
— Название метода$args
— Аргументы
-
void public onPacket ( array $pct )
- Вызывается когда получен пакет
$pct
— Data
-
void public onFrame ( string $data, string $type )
- Вызывется когда получен фрейм
$data
— Содержимое фрейма$type
— Тип фрейма
Сеть
Пул ← Сеть
namespace PHPDaemon\Network;
abstract class Pool extends ObjectStorage;
Хранит в себе активные объекты Соединение и ОткрытыйСокет.
Пул (клиент или сервер) можно инстанцировать из пользовательского приложении, например:
$this->httpclient = \PHPDaemon\Clients\HTTP\Pool::getInstance();
или
/* ... */
$this->pool = \PHPDaemon\Servers\FlashPolicy\Pool::getInstance([
'listen' => 'tcp://0.0.0.0:843'
]);
$this->pool->onReady();
/* ... */
Но не забывайте отправлять ему onReady(), onShutdown() и onConfigUpdated() события.
В большинстве случаев сервер запускается одноименнным приложением Pool.
# контекст для ssl соединения (опционально)
TransportContext:myContext {
tls;
certFile "/path/to/cert.pem";
pkFile "/path/to/privkey.pem";
passphrase "";
verifyPeer true;
allowSelfSigned true;
}
# слушаем 80 и 443 порт
Pool:HTTPServer {
listen "tcp://0.0.0.0:80", "tcp://0.0.0.0:443##myContext";
port 80;
privileged;
maxconcurrency 1;
}
-
string public $connectionClass;
- Default connection class
-
string public $name;
- Name
-
\PHPDaemon\Config\Section public $config;
- Configuration
-
integer public $maxConcurrency = 0;
- Max concurrency
-
integer public $maxAllowedPacket = 0;
- Max allowed packet
-
object public $appInstance;
- Application instance object
-
public __construct ( array $config = [], boolean $init = true )
- Constructor
$config
— Config variables$init
— @TODO
-
public onReady ( )
- Called when the worker is ready to go
-
public onConfigUpdated ( )
- Called when worker is going to update configuration
-
public static getInstance ( string $arg = '', boolean $spawn = true )
- Returns instance object
$arg
— name / array config / ConfigSection$spawn
— Spawn? Default is true
-
public setConnectionClass ( string $class )
- Sets default connection class
$class
— String name
-
public enable ( )
- Enable socket events
-
public disable ( )
- Disable all events of sockets
-
public onShutdown ( boolean $graceful = false )
- Called when application instance is going to shutdown
$graceful
— graceful
-
public finish ( boolean $graceful = false )
- Finishes ConnectionPool
$graceful
— graceful
-#[Connection].method ```php:p.inline.wico public attach ( [Connection] (#../../connection) $conn, $inf = null )
-.n Attach Connection -.n.ti `:hc`$conn` — Connection -.n `:hc`$inf` — Info -#[Connection].method ```php:p.inline.wico public [!:detach](#network/pool/methods/detach) ( [!:[Connection]](#network/pool/methods/[Connection]) (#../../connection) $conn )
- Detach Connection
$conn
— Connection
-
public connect ( string $url, callable $cb, string $class = null )
- Establish a connection with remote peer
$url
— URL$cb
— Optional. Callback$class
— Optional. Connection class name
Client ← Сеть
namespace PHPDaemon\Network;
abstract class Client extends Pool;
@TODO
-
void public addServer ( string $url, integer $weight = NULL )
- Adds server
$url
— Server URL$weight
— Weight
-
boolean public getConnection ( string $url = null, callable $cb = null, integer $pri = 0 )
- Returns available connection from the pool
$url
— Address$cb
— onConnected$pri
— Optional. Priority
-#[Connection].method ```php:p.inline.wico void public detach ( [Connection] (#../../connection) $conn )
-.n Detach Connection -.n.ti `:hc`$conn` — Connection -#[ClientConnection].method ```php:p.inline.wico void public [!:markConnFree](#network/client/methods/markConnFree) ( [!:[ClientConnection]](#network/client/methods/[ClientConnection]) (#../../clientconnection) $conn, string $url )
- Mark connection as free
$conn
— Connection$url
— URL
-#[ClientConnection].method ```php:p.inline.wico void public markConnBusy ( [ClientConnection] (#../../clientconnection) $conn, string $url )
-.n Mark connection as busy -.n.ti `:hc`$conn` — Connection -.n `:hc`$url` — URL -#[ClientConnection].method ```php:p.inline.wico void public [!:detachConnFromUrl](#network/client/methods/detachConnFromUrl) ( [!:[ClientConnection]](#network/client/methods/[ClientConnection]) (#../../clientconnection) $conn, string $url )
- Detaches connection from URL
$conn
— Connection$url
— URL
-
void public touchPending ( string $url )
- Touch pending "requests for connection"
$url
— URL
-
boolean public getConnectionByKey ( string $key, callable $cb = null )
- Returns available connection from the pool by key
$key
— Key$cb
— Callback
-
boolean public getConnectionRR ( callable $cb = null )
- Returns available connection from the pool
$cb
— Callback
-
boolean public requestByServer ( string $server, string $data, callable $onResponse = null )
- Sends a request to arbitrary server
$server
— Server$data
— Request$onResponse
— Callback called when the request complete
-
boolean public requestByKey ( string $key, string $data, callable $onResponse = null )
- Sends a request to server according to the key
$key
— Key$data
— Request$onResponse
— Callback called when the request complete
-
boolean public onShutdown ( boolean $graceful = false )
- Called when application instance is going to shutdown
$graceful
— @TODO
ClientConnection ← Сеть
namespace PHPDaemon\Network;
class ClientConnection extends Connection;
@TODO
Методы ← ClientConnection ← Сеть
-
void public __construct ( resource $fd, object $pool = null )
- Constructor
$fd
— File descriptor$pool
— ConnectionPool
-
boolean public isBusy ( )
- Busy?
-
void public onResponse ( callable $cb )
- Push callback to onReponse stack
$cb
— callable
-
void public onReady ( )
- Called when the connection is handshaked (at low-level), and peer is ready to recv. data
-
void public setFree ( boolean $free = true )
- Set connection free/busy
$free
— Free?
-
void public release ( )
- Set connection free
-
void public checkFree ( )
- Set connection free/busy according to onResponse emptiness and ->finished
-
integer public getQueueLength ( )
- @TODO
-
boolean public isQueueEmpty ( )
- @TODO
-
void public onFinish ( )
- Called when connection finishes
Connection ← Сеть
namespace PHPDaemon\Network;
abstract class Connection extends IOStream;
@TODO
Методы ← Connection ← Сеть
-
boolean public isConnected ( )
- Connected?
-
void public setDgram ( boolean $bool )
- Sets DGRAM mode
$bool
— @TODO
-
void public setPeername ( string $host, integer $port )
- Sets peer name
$host
— Hostname$port
— Port
-
mixed public __get ( string $name )
- Getter
$name
— Name
-
void public getSocketName ( string &$addr, string &$port )
- Get socket name
&$addr
— Addr&$port
— Port
-
void public setParentSocket ( \PHPDaemon\BoundSocket\Generic $sock )
- Sets parent socket
-
void public onUdpPacket ( @TODO $pct )
- Called when new UDP packet received
$pct
— @TODO
-
void public onReady ( )
- Called when the connection is handshaked (at low-level), and peer is ready to recv. data
-
void public onInheritanceFromRequest ( object $req )
- Called if we inherit connection from request
$req
— Parent Request
-
void public onFailure ( )
- Called when the connection failed to be established
-
void public onFailureEv ( \EventBufferEvent $bev = null )
- Called when the connection failed
$bev
— @TODO
-
void public __destruct ( )
- Destructor
-
boolean public write ( string $data )
- Send data to the connection. Note that it just writes to buffer that flushes at every baseloop
$data
— Data to send
-
void public onConnected ( callable $cb )
- Executes the given callback when/if the connection is handshaked
$cb
— callable
-
string public getUrl ( )
- Get URL
-
string public getHost ( )
- Get host
-
integer public getPort ( )
- Get port
-
boolean public connect ( string $url, callable $cb = null )
- Connects to URL
$url
— URL$cb
— Callback
-
boolean public connectUnix ( string $path )
- Establish UNIX socket connection
$path
— Path
-
boolean public connectRaw ( string $host )
- Establish raw socket connection
$host
— Host
-
boolean public connectUdp ( string $host, integer $port )
- Establish UDP connection
$host
— Hostname$port
— Port
-
boolean public connectTcp ( string $host, integer $port )
- Establish TCP connection
$host
— Hostname$port
— Port
-
void public setKeepalive ( boolean $bool )
- Set keepalive
$bool
— @TODO
-
void public close ( )
- Close the connection
-
void public setTimeouts ( integer $read, integer $write )
- Set timeouts
$read
— Read timeout in seconds$write
— Write timeout in seconds
-
void public setOption ( integer $level, integer $optname, mixed $val )
- Set socket option
$level
— Level$optname
— Option$val
— Value
-
void public onFinish ( )
- Called when connection finishes
IOStream ← Сеть
namespace PHPDaemon\Network;
abstract class IOStream;
@TODO
-
ConnectionPool public $pool;
- Associated pool
-
void public __construct ( resource $fd = null, object $pool = null )
- IOStream constructor
$fd
— File descriptor. Optional$pool
— Pool. Optional
-
mixed public __get ( string $name )
- Getter
$name
— Name
-
boolean public isFreed ( )
- Freed?
-
boolean public isFinished ( )
- Finished?
-
\EventBufferEvent public getBev ( )
- Get EventBufferEvent
-
resource public getFd ( )
- Get file descriptor
-
void public setContext ( object $ctx, integer $mode )
- Sets context mode
$ctx
— Context$mode
— Mode
-
void public setFd ( resource $fd, \EventBufferEvent $bev = null )
- Sets fd
$fd
— File descriptor$bev
— EventBufferEvent
-
void public setTimeout ( integer $rw )
- Set timeout
$rw
— Timeout
-
void public setTimeouts ( integer $read, integer $write )
- Set timeouts
$read
— Read timeout in seconds$write
— Write timeout in seconds
-
void public setPriority ( integer $p )
- Sets priority
$p
— Priority
-
void public setWatermark ( integer $low = null, integer $high = null )
- Sets watermark
$low
— Low$high
— High
-
string public readLine ( integer $eol = null )
- Reads line from buffer
$eol
— @TODO
-
boolean public drain ( integer $n )
- Drains buffer
$n
— Numbers of bytes to drain
-
boolean public drainIfMatch ( string $str )
- Drains buffer it matches the string
$str
— Data
-
string public lookExact ( integer $n, integer $o = 0 )
- Reads exact $n bytes of buffer without draining
$n
— Number of bytes to read$o
— Offset
-
boolean public prependInput ( string $str )
- Prepends data to input buffer
$str
— Data
-
boolean public prependOutput ( string $str )
- Prepends data to output buffer
$str
— Data
-
string public look ( integer $n, integer $o = 0 )
- Read from buffer without draining
$n
— Number of bytes to read$o
— Offset
-
string public substr ( integer $o, integer $n = -1 )
- Read from buffer without draining
$o
— Offset$n
— Number of bytes to read
-
integer public search ( string $what, integer $start = 0, integer $end = -1 )
- Searches first occurence of the string in input buffer
$what
— Needle$start
— Offset start$end
— Offset end
-
string public readExact ( integer $n )
- Reads exact $n bytes from buffer
$n
— Number of bytes to read
-
integer public getInputLength ( )
- Returns length of input buffer
-
boolean public gracefulShutdown ( )
- Called when the worker is going to shutdown
-
boolean public freezeInput ( boolean $at_front = false )
- Freeze input
$at_front
— At front. Default is true. If the front of a buffer is frozen, operations that drain data from the front of the buffer, or that prepend data to the buffer, will fail until it is unfrozen. If the back a buffer is frozen, operations that append data from the buffer will fail until it is unfrozen
-
boolean public unfreezeInput ( boolean $at_front = false )
- Unfreeze input
$at_front
— At front. Default is true. If the front of a buffer is frozen, operations that drain data from the front of the buffer, or that prepend data to the buffer, will fail until it is unfrozen. If the back a buffer is frozen, operations that append data from the buffer will fail until it is unfrozen
-
boolean public freezeOutput ( boolean $at_front = true )
- Freeze output
$at_front
— At front. Default is true. If the front of a buffer is frozen, operations that drain data from the front of the buffer, or that prepend data to the buffer, will fail until it is unfrozen. If the back a buffer is frozen, operations that append data from the buffer will fail until it is unfrozen
-
boolean public unfreezeOutput ( boolean $at_front = true )
- Unfreeze output
$at_front
— At front. Default is true. If the front of a buffer is frozen, operations that drain data from the front of the buffer, or that prepend data to the buffer, will fail until it is unfrozen. If the back a buffer is frozen, operations that append data from the buffer will fail until it is unfrozen
-
void public onWrite ( )
- Called when the connection is ready to accept new data
-
boolean public write ( string $data )
- Send data to the connection. Note that it just writes to buffer that flushes at every baseloop
$data
— Data to send
-
boolean public writeln ( string $data )
- Send data and appending \n to connection. Note that it just writes to buffer flushed at every baseloop
$data
— Data to send
-
void public finish ( )
- Finish the session. You should not worry about buffers, they are going to be flushed properly
-
void public close ( )
- Close the connection
-
void public unsetFd ( )
- Unsets pointers of associated EventBufferEvent and File descriptr
-
void public onReadEv ( \EventBufferEvent $bev )
- Called when the connection has got new data
$bev
— Bufferevent
-
void public onWriteOnce ( callable $cb )
- Push callback which will be called only once, when writing is available next time
$cb
— Callback
-
void public onWriteEv ( \EventBufferEvent $bev )
- Called when the connection is ready to accept new data
$bev
— Bufferedevent
-
void public onStateEv ( \EventBufferEvent $bev, integer $events )
- Called when the connection state changed
$bev
— Bufferevent$events
— Events
-
integer public moveToBuffer ( \EventBuffer $dest, integer $n )
- Moves arbitrary number of bytes from input buffer to given buffer
$dest
— Destination nuffer$n
— Max. number of bytes to move
-
integer public writeFromBuffer ( \EventBuffer $src, integer $n )
- Moves arbitrary number of bytes from given buffer to output buffer
$src
— Source buffer$n
— Max. number of bytes to move
-
string public read ( integer $n )
- Read data from the connection's buffer
$n
— Max. number of bytes to read
-
string public readUnlimited ( )
- Reads all data from the connection's buffer
Server ← Сеть
namespace PHPDaemon\Network;
abstract class Server extends Pool;
@TODO
-
array public $allowedClients = null;
- Allowed clients
-
integer public $maxAllowedPacket;
- @TODO
-
void public __construct ( array $config = [], boolean $init = true )
- Constructor
$config
— Config variables$init
— @TODO
-
boolean public finish ( boolean $graceful = false )
- Finishes ConnectionPool
$graceful
— @TODO
-
integer public bindSockets ( mixed $addrs = [], integer $max = 0 )
- Bind given sockets
$addrs
— Addresses to bind$max
— Number of bound
-
boolean public bindSocket ( string $uri )
- Bind given socket
$uri
— Address to bind
-
void public attachBound ( \PHPDaemon\BoundSocket\Generic $bound, mixed $inf = null )
- Attach Generic
$bound
— Generic$inf
— Info
-
void public detachBound ( \PHPDaemon\BoundSocket\Generic $bound )
- Detach Generic
$bound
— Generic
-
void public closeBound ( )
- Close each of binded sockets
-
boolean public inheritFromRequest ( object $req, object $oldConn )
- Called when a request to HTTP-server looks like another connection
$req
— @TODO$oldConn
— @TODO
HTTPRequest
Generic ← HTTPRequest
namespace PHPDaemon\HTTPRequest;
abstract class Generic extends \PHPDaemon\Request\Generic;
@TODO
Свойства ← Generic ← HTTPRequest
-
boolean public $keepalive = false;
- @TODO
-
integer public $responseLength = 0;
- Current response length
-
array public static $hvaltr = ['; ' => '&', ';' => '&', ' ' => '%20'];
- Replacement pairs for processing some header values in parse_str()
-
array public static $htr = ['-' => '_'];
- State
Методы ← Generic ← HTTPRequest
-
void public firstDeferredEventUsed ( )
- @TODO
-
boolean public sendfile ( string $path, callable $cb, integer $pri = EIO_PRI_DEFAULT )
- Output whole contents of file
$path
— Path$cb
— Callback$pri
— Priority
-
boolean public checkIfReady ( )
- Called to check if Request is ready
-
integer public getUploadMaxSize ( )
- Upload maximum file size
-
void public postPrepare ( )
- Prepares the request body
-
boolean public ensureSentHeaders ( )
- Ensure that headers are sent
-
boolean public out ( string $s, boolean $flush = true )
- Output some data
$s
— String to out$flush
— Flush
-
void public onParsedParams ( )
- Called when request's headers parsed
-
boolean public combinedOut ( string $s )
- Outputs data with headers (split by \r\n\r\n)
$s
— String to out
-
void public chunked ( )
- Use chunked encoding
-
void public onWakeup ( )
- Called when the request wakes up
-
void public onSleep ( )
- Called when the request starts sleep
-
boolean public status ( integer $code = 200 )
- Send HTTP-status
$code
— Code
-
boolean public headers_sent ( string &$file, integer &$line )
- Checks if headers have been sent
&$file
— File name where output started in the file and line variables&$line
— Line number where output started in the file and line variables
-
array public headers_list ( )
- Return current list of headers
-
boolean public header ( string $s, boolean $replace = true, integer $code = false )
- Send the header
$s
— Header. Example:Location: http://php.net/
$replace
— Optional. Replace?$code
— Optional. HTTP response code
-
void public removeHeader ( string $s )
- Removes a header
$s
— Header name. Example:Location
-
integer public static parseSize ( string $value )
- Converts human-readable representation of size to number of bytes
$value
— Data
-#[Input].method ```php:p.inline.wico void public onUploadFileStart ( [Input] (#../input) $in )
-.n Called when file upload started -.n.ti `:hc`$in` — Input -#[Input].method ```php:p.inline.wico void public [!:onUploadFileChunk](#httprequest/generic/methods/onUploadFileChunk) ( [!:[Input]](#httprequest/generic/methods/[Input]) (#../input) $in, boolean $last = false )
- Called when chunk of incoming file has arrived
$in
— Input$last
— Last?
-
string public getUploadTempDir ( )
- @TODO
-
boolean public isUploadedFile ( string $path )
- Tells whether the file was uploaded via HTTP POST
$path
— The filename being checked
-
boolean public moveUploadedFile ( string $filename, string $dest )
- Moves an uploaded file to a new location
$filename
— The filename of the uploaded file$dest
— The destination of the moved file
-
boolean public readBodyFile ( )
- Read request body from the file given in REQUEST_BODY_FILE parameter
-
void public static parse_str ( string $s, array &$var, boolean $header = false )
- Replacement for default parse_str(), it supoorts UCS-2 like this: %uXXXX
$s
— String to parse&$var
— Reference to the resulting array$header
— Header-style string
Input ← HTTPRequest
namespace PHPDaemon\HTTPRequest;
class Input extends \EventBuffer;
@TODO
Свойства ← Input ← HTTPRequest
-
array public $curPart;
- Current Part
Методы ← Input ← HTTPRequest
-
void public setBoundary ( string $boundary )
- Set boundary
$boundary
— @TODO
-
void public freeze ( boolean $at_front = false )
- Freeze input
$at_front
— At front. Default is true. If the front of a buffer is frozen, operations that drain data from the front of the buffer, or that prepend data to the buffer, will fail until it is unfrozen. If the back a buffer is frozen, operations that append data from the buffer will fail until it is unfrozen
-
void public unfreeze ( boolean $at_front = false )
- Unfreeze input
$at_front
— At front. Default is true. If the front of a buffer is frozen, operations that drain data from the front of the buffer, or that prepend data to the buffer, will fail until it is unfrozen. If the back a buffer is frozen, operations that append data from the buffer will fail until it is unfrozen
-
boolean public isFrozen ( )
- Is frozen?
-
boolean public isEof ( )
- Is EOF?
-#[Generic].method ```php:p.inline.wico void public setRequest ( [Generic] (#../generic) $req )
-.n Set request -.n.ti `:hc`$req` — @TODO
-
void public sendEOF ( )
- Send EOF
-
integer public readFromBuffer ( \EventBuffer $buf )
- Moves $n bytes from input buffer to arbitrary buffer
$buf
— Source nuffer
-
void public readFromString ( string $chunk, boolean $final = true )
- Append string to input buffer
$chunk
— Piece of request input$final
— Final call is THIS SEQUENCE of calls (not mandatory final in request)?
-
string public look ( integer $n, integer $o = 0 )
- Read from buffer without draining
$n
— Number of bytes to read$o
— Offset
-
void public parseMultipart ( )
- Parses multipart
-
string public getChunkString ( )
- Get current upload chunk as string
-
boolean public writeChunkToFd ( resource $fd, callable $cb = null )
- Write current upload chunk to file descriptor
$fd
— File destriptor$cb
— Callback
-
void public log ( string $msg )
- Log
$msg
— Message
ЧаВО
Как сделать событие, которое вызывается через заданный временной интервал?
См. Библиотеки/Timer
Публикации
- phpDaemon и runkit: новый уровень (23 сентября 2010)
- True FastCGI для PHP: миграция и тесты (7 сентября 2010)
- WebSocket: будущее уже здесь! (8 июня 2010)
- phpDaemon: хорошие новости (24 мая 2010)
- phpDaemon: фреймворк асинхронных приложений (11 января 2010)
Внести свою лепту
Если хотите помочь, то даже если располагаете ограниченным временем, не стесняйтесь! Проекту пригодится любая помощь.
Эта документация ← Внести свою лепту
Мы очень хотим свести количество недокументированного кода к минимуму, но нам не хватает рук. Даже написав абзац текста, потратив десять минут, вы уже сделаете большое дело.
Внесение изменений ← Эта документация ← Внести свою лепту
Старайтесь вносить изменения в на том языке, которым владеете лучше всего. Если набрались смелости добавить новый язык, возьмите за основу наиболее близкий из присутствующих.
Чтобы внести изменения в эту документацию, необходимо:
- Сделать Fork репозитория kakserpom/daemon.io
- Внести изменения в Markdown (.md) файлы в папке
./docs/<язык>/
- Скомпилировать index.html, выполнив команду
./docs/build
- Посмотреть как выглядят внесенные изменения в браузере
- Послать Pull Request
Хотите видеть изменения в браузере, не запуская каждый раз команду? Запустите
watch -n1 ./docs/build
— она будет выполняться раз в секунду
Формат документации ← Эта документация ← Внести свою лепту
Мы используем Markdown (о синтаксисе по-русски) с некоторыми дополнениями.
Вложенность ← Формат документации ← Эта документация ← Внести свою лепту
Для удобства работы документация разбита на множество мелких файлов.
Подключение файла осуществляется строкой иморта: <!-- import filepath.md -->
.
Путь к подключаемому файлу указывается относительно текущего.
Константы ← Формат документации ← Эта документация ← Внести свою лепту
Константы используются для языковых настроек и короткой записи часто используемых шаблонов.
Записываются в виде <!-- pvar Название ..Значение.. -->
Обязательные языковые константы lang
, title
, menu-*
должны быть переведены для каждой языковой версии документации.
Константы могут быть использованы как шаблоны. Применение шаблона: {Название Значение1 Значение2...}
. Значения будут подставлены в шаблон вместо %s
.
Пример шаблона:
<!-- pvar tpl-outlink <a target="_blank" href="%s">%s<i class="fa fa-external-link"></i></a> -->
Пример использования:
{tpl-outlink http://ru.wikipedia.org/wiki/Markdown Markdown}
Заголовки ← Формат документации ← Эта документация ← Внести свою лепту
Заголовки могут быть описаны следующими способами:
## якорь # Заголовок
## якорь # Заголовок #> Форматированный заголовок
якорь
- идентификатор заголовка для навигации, который указывается в адресе. Разрешенные символы [a-zA-Z0-9_-]
. Должен быть уникальным среди якорей на своём уровне, чтобы избежать коллизий адресов.
Форматированный заголовок
используется в тех случаях, когда заголовок в на странице должен отличаться от заголовка в навигационной панели.
Примеры:
- Заголовок первого уровня:
## contribute # Внести свою лепту
- Заголовок второго уровня:
### this-doc # Эта документация
- Заголовок третьего уровня:
#### markdown # Формат документации
- Заголовок четвертого уровня:
#### headings # Заголовки
- Форматированный заголовок:
### mysql # MySQL #> Клиенты \ MySQL
При добавлении нового заголовка учтите, что якорь должен быть строго на английском языке и быть простым и информативным. При переводе якори не изменяются
Списки ← Формат документации ← Эта документация ← Внести свою лепту
Можно указать CSS-класс элемента листа:
-.n Элемент без символа списка
-.n.ti Элемент без символа списка и с отступом от предыдущего
На данный момент используются CSS-классы:
.n
- Элемент без символа списка.ti
- Отступ от предыдущего элемента.method
- Специальный CSS-класс для Методов
Курсив и жирный ← Формат документации ← Эта документация ← Внести свою лепту
Выделение курсивом и жирным работает только через *
, _
отключен для совместимости с программным кодом.
Однострочный код ← Формат документации ← Эта документация ← Внести свою лепту
Выделение кода апострофами `...`
дополнено возможностью применять модификаторы и CSS-классы.
Модификаторы — это опции, включающие дополнительную обработку текста.
Модификаторы и классы пишутся после открывающего апострофа и должны быть закрыты дополнительным перед началом текста. Перед указанием модификаторов ставится символ :
(двоеточие). Каждый модификатор указывается одним латинским символом. Классы указываются с помощью ведущей точки.
При указании одновременно и модификаторов, и классов, сначала должны быть записаны модификаторы.
Список модификаторов:
:e
- кодировать символы (по-умолчаниб кодирование символов выключено):p
- парсинг ссылок:h
- php подсветка кода:c
- стилевое оформление без фона и обводки
Из классов на данный момент может применять только .clear
, но лучше указывайте модификатор :c
.
Примеры использования:
`:hc`$url`
`:p`max-requests ([Number](#config/types/number) = '10k')`
`:ph.clear`callback ( [Connection](#clients/http/connection) $conn, boolean $success )`
Многострочный код ← Формат документации ← Эта документация ← Внести свою лепту
Многострочный код добавлен возможностью подсветки синтаксиса и указанием CSS-классов.
Код, содержащий конфигурацию, обозначается синтаксисом ruby
.
Из классов на данный момент может применять только .inline
для оформления методов.
Примеры:
```php.inline
void public post ( url $url, array $data, array $params )
void public post ( url $url, array $data, callable $resultcb )
``````ruby
Pool:HTTPServer {listen "tcp://0.0.0.0:80", "tcp://0.0.0.0:443##myContext"; port 80; privileged; maxconcurrency 1;
}
```
PHPDoc ← Внести свою лепту
Аналогично, чтобы восполнить пробелы в PHPDoc-комментариях в коде, сделайте Fork основного репозитория, внесите изменения и пошлите Pull Request.
Учтите, что все PHPDoc-комментарии пишутся строго на английском языке
Программный код ← Внести свою лепту
Улучшения программного кода всегда приветствуется. Если у вас есть модуль для публикации, и вы считаете, что он заслуживает включения в основной репозиторий, пришлите Pull Request. Аналогично поступайте с улучшениями существующего кода.
Авторы документации
Написание ← Авторы документации
- Dmitry Efimenko <[email protected]>
- Vasily Zorin <[email protected]>
- Alexey Sharov <[email protected]>
Перевод на русский ← Авторы документации
- Vasily Zorin <[email protected]>
Корректура русской версии ← Авторы документации
...
Программирование ← Авторы документации
- Dmitry Efimenko <[email protected]>