Как подключить Yii к phpDaemon

Для чего

Для того, чтобы пользоваться Yii в режиме службы (демона). Хорошо подходит для развертки WebSocket-сервера.

Решение

Решение на самом деле очень простое. Нужно всего лишь подключить файл фреймворка yii.php и построить приложение.

class WebSocketServer extends AppInstance
{

    public function onReady()
    {

        define('YII_ENABLE_ERROR_HANDLER', false);

        require_once('../vendor/yiisoft/yii/framework/yii.php');
        $config = '../protected/config/main.php';
        Yii::createWebApplication($config);
        // ...
    }

    // ...
}

Теперь можно спокойно вызывать Yii::app()

Запуск контроллера

Yii::app()->runController('site/index');

Правим PHPDoc

Yii::app() возвращает CApplication, а метод runController() принадлежит CWebApplication, поэтому среда может ругаться. В этом случае переопределите PHPDoc класса Yii, либо через промежуточную переменную (мы все равно это вызываем 1 раз, интерпретатор это дело соптимизирует):

/** @var \CWebApplication $app */
$app = Yii::app();
$app->runController('site/index');

Подводные камни

Без YII_ENABLE_ERROR_HANDLER = false, Yii зарегистрирует свой обработчик ошибок и при первом же notice|warning|error отправит сервер спать (спасибо Василию Зорину, он рассказал это здесь) protected/runtime папка должна быть обязательно и с правами 777 (у меня без папки зависало все приложение, причем убивать его после зависа только через kill -9) папка protected у меня лежит в корне проекта при protected/config/main.php сервер работает, а вот при protected/config.php сервер уже падает папки в protected: config, controllers, models, runtime

Перезапуск зависшего сервиса Ищем PID-ы запущенный процессов

# ps ax | grep phpd | grep process
31862 ?        SNs    0:00 phpd: master process
31864 ?        SNl    0:00 phpd: worker process

Убиваем с наивысшим приоритетом

# kill -9 31862 31864

И перезапускаем

# phpd restart

Дополнительно

http://www.yiiframework.com/doc/guide/1.1/en/extension.integration#using-yii-in-3rd-party-systems