Php 当我使用Http\Response::send时,Phalcon非常慢

Php 当我使用Http\Response::send时,Phalcon非常慢,php,phalcon,Php,Phalcon,我建立了一个微型应用程序,一切正常。但是性能测试显示了令人沮丧的结果。应用程序非常慢: ab -n 1000 -c 50 http://myproject.net/ 正常结果: Concurrency Level: 100 Time taken for tests: 58.083 seconds Complete requests: 1000 Failed requests: 0 Non-2xx responses: 1000 Total tra

我建立了一个微型应用程序,一切正常。但是性能测试显示了令人沮丧的结果。应用程序非常慢:

ab -n 1000 -c 50 http://myproject.net/
正常结果:

Concurrency Level:      100
Time taken for tests:   58.083 seconds
Complete requests:      1000
Failed requests:        0
Non-2xx responses:      1000
Total transferred:      578000 bytes
HTML transferred:       189000 bytes
Requests per second:    17.22 [#/sec] (mean)
Time per request:       5808.272 [ms] (mean)
Time per request:       58.083 [ms] (mean, across all concurrent requests)
Transfer rate:          9.72 [Kbytes/sec] received
在我发表评论之后,$response->send()测试结果变得更好:

Concurrency Level:      100
Time taken for tests:   7.960 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      166000 bytes
HTML transferred:       0 bytes
Requests per second:    125.62 [#/sec] (mean)
Time per request:       796.048 [ms] (mean)
Time per request:       7.960 [ms] (mean, across all concurrent requests)
Transfer rate:          20.36 [Kbytes/sec] received
在索引文件中,我将响应对象定义为共享服务:

$di->setShared(System::RESPONSE, new App\Http\Response());
App\Http\Response是一个扩展\Phalcon\Http\Response的类,允许我在应用程序中添加一些所需的头

namespace App\Http;

class Response extends \Phalcon\Http\Response
{
    public function getDefaultErrorMessages()
    {
        return $this->defaultErrorMessages;
    }

    public function setDefaultErrorMessages($messages)
    {
        $this->defaultErrorMessages = $messages;
    }

    public function setErrors(array $messages)
    {
       $this->validationErrors = $messages;
    }

    public function setErrorContent(\Exception $e, $developerInfo = false)
    {
        $errorCode = $e->getCode();
        $statusCode = 500;
        $message = 'Unspecified error';

        $error = [];
        if ($this->validationErrors) {
            $error['errors'] = $this->validationErrors;
        }


        $this->setJsonContent(['error' => $error]);
        $this->setStatusCode($statusCode);
    }


    public function setJsonContent($content, $jsonOptions = 0, $depth = 512)
    {
        parent::setJsonContent($content, $jsonOptions, $depth);
        $this->setHeader('Access-Control-Allow-Origin', '*');
        $this->setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
        $this->setHeader(
            'Access-Control-Allow-Headers',
            'Content-Type, X-Requested-With, X-Authorization'
        );

        $this->setContentType('application/json');
    }
}
我的所有代码都封装在索引文件中的try-catch语句中。 如果Zephir抛出的异常显示出快速的结果,而如果Zephir抛出的异常显示出相同的慢速结果,我试图通过抛出一个错误来抛出一个异常

当我使用'ab'的-k修饰符时,效果会更好:

ab -k -n 1000 -c 50 http://myproject.net/

是否已禁用视图组件?在代码的其他部分发送响应时,为什么要发送响应

在我的一个项目中,我有一个Api模块。此API模块已全局禁用视图:

app/modules/api/Module.php

在此之后,我确信这里不会构建任何与视图相关的服务。在Api控制器名称空间中,我有它们的基础

app/modules/api/controllers/controllerBase.php

在index.php中:


请检查您的代码,因为这不是第一次有人因为
send()
method而出现Phalcon减速问题。如果您开始更改代码,您可能会幸运地发现原因。我猜是视图生成。

可能与我刚才写的内容重复,试图解释问题。是否返回响应对象?是真是假?请告诉我您在控制器中执行的操作,以便它可以这样运行。感谢您的响应,我将尝试全局禁用视图。虽然应用程序是一个API,因此没有视图,但它只返回处理过的数据。我将尝试您的解决方案并告诉您结果。如果您的应用程序中不需要任何视图(只是一个API),请尝试在
Phalcon\Mvc\application
实例上使用
$application->useImplicitView(false)
。在我的本地计算机中结果仍然相同,我仍然不确定这是什么确切原因。与其他项目相比,测试结果有点好,尽管我希望更好一些。例如,我注意到我的一段代码加载了控制器中的所有服务,它通过将总测试时间至少增加11秒来影响测试结果:“下一条注释中的代码”。但是,我仍然在等待将项目上传到服务器,然后我将发布我的反馈。
抽象类服务{private static$Services=[];公共静态函数getService($name){if(!isset(static::$Services[$name]){static::$Services[$name]=static::get($name);}返回静态::$services[$name];}公共静态函数get($name){$className=“\\services\\Service\\{$name}”如果(!class_存在($className)){抛出新异常(“服务{$className}不存在”);}返回新的$className();}
上述代码可能会在实例化每个服务时出现问题,即使它不需要实际请求。
    public function registerServices($di)
    {
        // ....
        $di->getView()->disable();
    }
<?php

namespace Application\Api\Controllers;
use \Phalcon\Mvc\Controller;

class ControllerBase extends Controller {

    /**
     * Captures method result and tries to make a JSON response out of it.
     * 
     * @param \Phalcon\Mvc\Dispatcher $dispatcher
     * @return \Phalcon\Http\Response
     */
    protected function afterExecuteRoute($dispatcher) {
        $content = $dispatcher->getReturnedValue();

        // some logic for prematurely generated content (debugs/warnings)
        // ...

        if(is_object($content)) {
            if(is_callable(array($content, 'toArray'))) {
                $content = $content->toArray();
            } else {
                $content = (array) $content;
            }
        }


        $this->response->setContentType('application/json', 'UTF-8');

        $this->response->setJsonContent($frame);

        return $this->response->send();
    }
}
        // from previous code frame
        $this->response->setJsonContent($frame);

        return $this->response; // no send() here
    }
}
echo $application->handle() // returning instance of Response
         ->getContent(); // getting content to echo