0

我在 ZF2 项目中使用 Doctrine 2,但我的服务器 CPU 和内存出现了一些奇怪的问题。我的服务器只是崩溃了。

我收到了很多睡眠状态查询,但它们似乎没有得到清理。

    mysql> show processlist;
    +---------+--------------+-----------+------------------+----------------+------+--------------------+------------------------------------------------------------------------------------------------------+
    | Id | User | Host | db | Command | Time | State | Info |
    +---------+--------------+-----------+------------------+----------------+------+--------------------+------------------------------------------------------------------------------------------------------+
    | 2832346 | leechprotect | localhost | leechprotect | Sleep | 197 | | NULL |
    | 2832629 | db_user | localhost | db_exemple | Sleep | 3 | | NULL |
    | 2832643 | db_user | localhost | db_exemple | Sleep | 3 | | NULL |
    | 2832646 | db_user | localhost | db_exemple | Sleep | 3 | | NULL |
    | 2832664 | db_user | localhost | db_exemple | Sleep | 154 | | NULL |
    | 2832666 | db_user | localhost | db_exemple | Sleep | 153 | | NULL |
    | 2832669 | db_user | localhost | db_exemple | Sleep | 152 | | NULL |
    | 2832674 | db_user | localhost | db_exemple | Sleep | 7 | | NULL |
    | 2832681 | db_user | localhost | db_exemple | Sleep | 1 | | NULL |
    | 2832683 | db_user | localhost | db_exemple | Sleep | 4 | | NULL |
    | 2832690 | db_user | localhost | db_exemple | Sleep | 149 | | NULL |

(.......)

此外,似乎 php GC 并没有从内存中清除所有对象,甚至没有杀死进程。有没有办法禁用缓存系统?它会改善我资源的使用吗=

我的大多数查询类似于:

$query = $this->createQueryBuilder('i');
        $query->innerJoin('\Application\Relation', 'r', 'WITH', 'r.child = i.id');
        $query->innerJoin('\Application\Taxonomy', 't', 'WITH', 't.id = r.taxonomy');

        $query->where('t.type = :type')->setParameter('type', $relation);
        $query->groupBy('i.id');

        $items = $query->getQuery()->getResult(2);

提前致谢。

4

1 回答 1

0

首先检查 mysql 的wait_timout变量。从文档中:

Wait_timeout :服务器在关闭非交互式连接之前等待其活动的秒数。

在正常流程中(不使用持久连接),php 在脚本执行后自动关闭连接。确保没有休眠线程;在脚本结束时只需关闭连接:

$entityManager->getConnection()->close();

如果这些查询在一个很大的 while/for 循环中运行,您可能需要阅读学说 2 批处理文档。

于 2013-05-18T13:55:33.477 回答