如何跟踪Phalcon中的API调用

时间:2016-03-15 09:50:15

标签: php api phalcon

我需要跟踪Phalcon中不同用户调用的API,并将用户的IP地址插入日志文件中。我怎样才能在Phalcon中做到这一点?

3 个答案:

答案 0 :(得分:2)

Phalcon有一个专门用于记录的类,将它与路径事件相结合,您可以优雅地记录用户的活动。在您的控制器中(我建议使用ControllerBase,因为它将记录请求资源的用户的所有实例):

use Phalcon\Events\Event;
use Phalcon\Mvc\Controller;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Logger\Adapter\File as FileAdapter;

class ControllerBase extends Controller
{
    /**
     * Executed after every found action is executed
     * Logs all requests to controllers
     *
     * @param \Phalcon\Events\Event $event
     * @param \Phalcon\Mvc\Dispatcher $dispatcher
     * @return void
     */
    public function afterExecuteRoute(Event $event, Dispatcher $dispatcher)
    {
        // Set up a logger instance
        $logger = new FileAdapter("app/logs/request.log");

        // Log the message
        $logger->info(sprintf("Client %s executed %s::%s on route %s", 
            $this->request->getClientAddress(),
            $dispatcher->getControllerName(),
            $dispatcher->getActionName(),
            $this->request->getURI()
        ));

        // Save the log 
        $logger->save();
    }
}

答案 1 :(得分:0)

我假设您正在使用MVC。

更好的方法是创建一个ControllerBase,扩展所有控制器。然后添加一个名为“onConstruct”的方法,在执行所有控制器之前执行任何操作,如下所示:

<?php

namespace MyProject\Api\Controllers;

use Phalcon\Mvc\Controller;
use Phalcon\Http\Response;
use Phalcon\Logger\Adapter\File;

class ControllerBase extends Controller {

    public function onConstruct(){
        // here is your code
    }

}

如果您只使用一个控制器来处理API的所有请求,只需在此控制器中添加onConstruct方法,而不需要扩展。

然后在此方法中,您可以执行此操作以获取IP并保存到文件:

public function onConstruct(){
    $ip_client = $this->request->getClientAddress(); // Here, you get the IP

    $logger = new \Phalcon\Logger\Adapter\File('../logs/requests.log', array('mode' => 'w'));
    $logger->error('['.date("H:i:s").']: '. " You are doing requests in my API: " . $ip_client);
    $logger->close();

}

我在构造中添加了这个,但您可以创建一个方法来执行此操作,以便在应用程序中的所有操作中保存日志。有一种很好的方法可以做到这一点,创建一个模型或一个帮助器类,处理这个日志:

$log = new \Logger();
$log->setMessage("You are doing some request in my API, funny");
$log->save();

答案 2 :(得分:0)

您最好使用dispatcherbeforeExecuteRoute。您还可以创建自定义侦听器作为其中事件的类。你还可以获得请求(和di容器中的ip,params,post,json等以静态方式调用它)。

https://docs.phalconphp.com/pl/latest/reference/dispatching.html