cakephp性能问题-模式加载30-50秒

ut6juiuv  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(319)

我正在为一家面包店开发一个在线销售管理应用程序。我决定使用cakephp作为框架,mochahost作为宿主提供者,因为我还没有听说这两种方法都有什么主要缺点。
我的申请目前正在开发阶段。它使用的mysql用户只有一个数据库可用,该数据库只有10-15个表,目前最多有50行(大多数表都是空的)。
我不确定,因为调试工具包只显示一个(或如果会话超时3)查询需要可接受的时间(小于0.2秒),但计时器说controller.shutdown事件或controller.startup事件需要30 000毫秒到58 000毫秒(!!)。
每次加载我的页面都需要30到60秒(!!!)。发现它是由获取架构信息引起的( getSchemaCollection(), typeMap() ). 好吧,我知道,开发设置使缓存只在2分钟左右可用,但是每次我重新加载页面都需要30-60秒,根本没有定义表关联。不,我没有运行任何异常复杂的东西,我使用身份验证组件和数据库会话。。。
使用定义的(深度)关联,它会运行很长时间,以至于页面终止http 504网关超时或502坏网关。由于没有任何响应,根据cpanel,脚本仍然在后台运行,阻止了我的一个可用的入口进程和mysql用户登录。这意味着我甚至不能开发我的页面,因为我不能加载它甚至一次有缓存进一步。在私有开发服务器上开发也无法工作:在第一次产品加载时,它还将尝试构建缓存。
也可以通过调用 Cache::disable() 一点帮助都没有。
我还注意到,有一个查询需要30-60秒才能在托管计划中包含的mysql服务器上运行,那就是 SHOW SCHEMAS . 我猜cakephp在 getSchemaCollection() 第一次接到电话。
此查询为您运行多长时间?我错了,这是完全不可接受的,我应该要求重新找到或立即修复?我负担不起这么长时间的页面加载,因为面包店每天有500名顾客,所以每次购买都会使用繁重的sql等。
当前会话表:

Field   Type    Null    Key Default Extra
id  char(40)    NO  PRI NULL    
created timestamp   NO      CURRENT_TIMESTAMP   
updated timestamp   NO      CURRENT_TIMESTAMP   on update CURRENT_TIMESTAMP
data    blob    YES     NULL    
expries int(10) YES     NULL    
ipAdress    varchar(15) NO      NULL    
user_id char(36)    YES MUL NULL

此表将user\ id作为users表pk(id)的外键。
sessionstable.php:

class SessionsTable extends Table
{
    public static $uid = null;

    public function initialize(array $config)
    {
        parent::initialize($config);
        //$this->belongsTo('Users');
    }

    public function implementedEvents()
    {
        return array(
            'Model.beforeSave' => 'beforeSave',
        );
    }

    public function beforeSave(Event $event, EntityInterface $entity, $options = []) {
        $request = Router::getRequest();
        $request->trustProxy = true;
        $entity->set('ipAdress', $request->clientIp());
        if (!is_null(self::$uid)) $entity->set('user_id', self::$uid);
    }
}

更新我不是一个php评测Maven,但如果我更正了相应的重要值是pdostatement->execute(),它会被94.13 self(?)/incl.(?)调用5次
更新2我收到了一个来自mochahost的快速而令人满意的回复,他说由于各种可以理解的性能原因,show schemas查询被禁用。他们建议我用 SHOW SCHEMAS LIKE 'myuser_%' 因为所有数据库名称都是“user\u dbname”格式。所以我的问题是,在cakephp中,我应该在哪里以及如何在默认情况下使用它?

7dl7o3gd

7dl7o3gd1#

我知道这个问题有点老了,但从那以后我一直在研究这个应用程序,设法解决了性能问题,它做得很好。对于那些遇到类似问题的人,这里是我对这个主题的全部想法:

答案

使用vps。这样,您就不必与其他用户(/apps)共享对同一mysql服务器示例的访问。注意这个解决方案还提供了更好的性能,当你的应用程序在每台服务器上的用户参与度达到一个阈值时。有关初学者的扩展开发的更多信息,请查看这篇文章。

在开发机器上构建db schema缓存,并将缓存文件复制到生产(或live-to-be/staging)系统。之后,任何一组 Configure::config('default', false) 启用生产模式,从而禁用快速缓存失效(开发默认值为2分钟);或者手动设置缓存过期限制 app.php 配置文件。注意:您可能需要定期更新缓存文件及其过期时间,以防止重建过程。

使用 SHOW DATABASES LIKE '(your username)\_%' . 这可能不会被禁用,但是在一个框架中实现这样的更改可能相当困难。假设您正在开发一个小的web应用程序,这可能不值得花时间来开发它。在大多数情况下使用上述解决方案。
但是
如果您需要修复其他软件环境或工具,如mysql workbench或phpmyadmin,请参阅后面的解决方案示例,使用第三个选项。注意:这只起作用,因为服务器上的所有架构名称都使用以下模式: (username)_(actual db name) .

更长的版本,一些额外的想法

如果宿主是共享(linux)环境上的实时计划,并且数据库也在共享环境中,那么提供者(mochahost)似乎禁用或限制了某些查询(或者至少是某些形式的查询),例如:
SHOW DATABASES SHOW SCHEMAS 查询 information_schema “请注意,为了获得最佳性能,我们使用单独的远程mysql数据库服务器。(…)对我们(共享计划)帐户的mysql数据库的访问受到限制,不允许执行 SHOW DATABASES 或者 SHOW SCHEMAS 命令。为了查看数据库列表,您应该使用类似的查询:(请参阅下文)。如果您需要远程访问mysql并且正在使用(共享计划)-您仍然可以这样做,但是由于mysql特权,您将无法使用上述命令。应用此限制是为了提高myql服务器的整体性能,以及提高正常运行时间和服务器安全性(对他们说,这封邮件实际上非常有用。)
仔细想想,这是可以理解的,我认为这是一个很好的做法。考虑使用一个查询来描述共享服务器或大型集群上的所有可用模式。这可能意味着要遍历和返回几十个、几百个甚至更多的条目。还要注意这里的安全问题,需要对结果进行过滤(使用更多资源),以避免暴露有关其他用户的敏感数据。是的,数据库名称是敏感数据。
而稍微调整一下查询,排除不相关的结果会产生更好的性能和明显的安全性: SHOW DATABASES LIKE '(your username)\_%' . 请再次注意,此解决方案只执行其工作,因为所有模式都以上述相同的模式命名。此外,您的提供商也可以禁用此功能。

使phpmyadmin(或其他数据库管理软件)工作

$usr = 'YourUserName';
$cfg['Servers'][$i]['DisableIS'] = true;
$cfg['Servers'][$i]['ShowDatabasesCommand'] = "SHOW DATABASES LIKE '$usr\_%'";

或者这样的代码在phpmyadmin的配置中应该做这个工作。请注意,这并不能保证工作,是一个变通办法-但最好给你一个解决你的问题的想法。
至于其他的数据库管理软件,我只有mysql工作台的经验。不幸的是,这个工具不支持调整,而是执行一个初始查询来获取模式。我将打开一个功能请求票证或一些排序,并在这里发布更新。
确保您选择的工具不会执行上述初始查询,或者-至少-有一个选项可以调整您的查询。

最后但并非最不重要

不要在公共生产环境中开发。从未。
尝试(测试)一个特定的dev快照是可以的。只要你马上把它取下来。不要泄露不稳定的软件。如果您真的需要,可以使用本地开发服务器(best)或独立开发服务器或vps作为开发服务器(考虑到安全性)。

vu8f3i0k

vu8f3i0k2#

听起来你知道问题所在。这个 SHOW SCHEMAS 加载不应花费30-60秒。这是服务器级的问题,假设您已经尝试手动运行该查询并产生相同的结果(在php应用程序的上下文之外)。
cakephp需要访问db模式才能发挥其魔力,因此我建议与宿主提供商讨论这个问题。

相关问题