Много ошибок, парень.
Для начала укажи пустой шаблон. Тогда ты сможешь отправить необходимые заголовки:
public $layout='//layouts/main';
В стандарте прописано, что сообщение надо слать следующим образом:
"data: сообщение\n\n"
или
"data: сообщение из двух строк\n"
"data: сообщение из двух строк\n\n"
Перепиши свою функцию, например, так:
function sendMsg($msg)
{
echo "data: " . $msg . "\n\n";
ob_flush();
flush();
}
Еще, кажется, в контроллере необходим обязательный actionError().
Вот мой рабочий код данного примера. Права доступа остались с прошлого проекта:
class SiteController extends Controller
{
public $layout='//layouts/main';
public function filters()
{
return array(
'accessControl',
'postOnly + delete',
);
}
public function actions()
{
return array(
'page'=>array(
'class'=>'CViewAction',
),
);
}
public function accessRules() {
return array(
array('allow',
'actions' => array('stream'),
'users' => array('*'),
),
array('allow',
'actions' => array('foo'),
'users' => array('@'),
),
array('allow',
'actions'=>array('foo'),
'users'=>array('admin'),
),
array('deny',
'users'=>array('*'),
),
);
}
public function actionError()
{
if($error=Yii::app()->errorHandler->error)
{
if(Yii::app()->request->isAjaxRequest)
echo $error['message'];
else
$this->render('error', $error);
}
}
protected function sendMessage($msg)
{
echo "data: " . $msg . "\n\n";
ob_flush();
flush();
}
protected function sendResponse($status = 200, $body = '', $contentType = 'application/json', $cache = 'no-cache')
{
$statusHeader = 'HTTP/1.1 ' . $status;
header( $statusHeader );
header( 'Content-type: ' . $contentType );
header( 'Cache-Control: ' . $cache );
self::sendMessage( $body );
}
function actionStream()
{
$t = 'message';
self::sendResponse( 200, $t, 'text/event-stream' );
}
}