已删除仍由symfony缓存调用的sql语句


Deleted sql statement still called by symfony cache

我正在使用Symfony 2.7

我没有使用条令,而是构建了一个服务,它处理所有原始sql语句,称为RawSQLManager。

随机地,当我多次提取同一个URL时,我的dev.log文件中出现了一个严重错误。我不明白这怎么可能。

在我的项目开始时,我已经建立了这个功能:

public function getFolderInfo($id_folder)
{
    $sql = 'SELECT zs.ID, zs.Nom, zs.Principale, zs.Archive, zs.DateHeureModification
        FROM Zones_Stockages zs
        WHERE zs.ID = :id_folder;';
    $params['id_folder'] = $id_folder;
    $stmt = $this->conn->prepare($sql);
    $stmt->execute($params);
    return $stmt->fetch();
}

现在,我不使用这个功能,她被删除了,在我的整个项目中没有人使用这个功能。

但这里是我的日志:

[2016-01-05 10:16:09] doctrine.DEBUG: SELECT t0.Principale AS Principale_1, t0.Archive AS Archive_2, t0.Nom AS Nom_3, t0.DateHeureModification AS DateHeureModification_4, t0.ID AS ID_5, t0.Abonnements_ID AS Abonnements_ID_6 FROM Zones_Stockages t0 WHERE t0.ID = ? ["7385"] []

正如您所看到的,这是完全相同的语句,在我的项目中没有类似的语句。

[EDIT]:我的初始陈述中没有Abonnements_ID。

我已经用以下内容清除了我的缓存:

 app/console doctrine:cache:clear-metadata 
 app/console doctrine:cache:clear-query  
 app/console doctrine:cache:clear-result 

甚至删除我的缓存文件夹。这个声明仍然可以调用。

这个奇怪的调用是在我在服务器上执行的每个请求时调用的,有时会在我的Abonnements实体上出现严重错误,但我不明白这与上一个调用有什么关系,也不知道如何开始调试这个实体的问题。

[2016-01-05 10:16:09] request.CRITICAL: Uncaught PHP Exception Symfony'Component'Debug'Exception'ContextErrorException: "Warning: rename(C:'wamp'www'app'cache'dev/doctrine/orm/Proxies'__CG__AppBundleEntityAbonnements.php.568b89d923b5a9.13683491,C:'wamp'www'app'cache'dev/doctrine/orm/Proxies'__CG__AppBundleEntityAbonnements.php): " at C:'wamp'www'vendor'doctrine'common'lib'Doctrine'Common'Proxy'ProxyGenerator.php line 306 {"exception":"[object] (Symfony''Component''Debug''Exception''ContextErrorException(code: 0): Warning: rename(C:''wamp''www''app''cache''dev/doctrine/orm/Proxies''__CG__AppBundleEntityAbonnements.php.568b89d923b5a9.13683491,C:''wamp''www''app''cache''dev/doctrine/orm/Proxies''__CG__AppBundleEntityAbonnements.php):  at C:''wamp''www''vendor''doctrine''common''lib''Doctrine''Common''Proxy''ProxyGenerator.php:306)"} []

因此,连续出现两个问题:

  1. 对幽灵陈述的呼唤
  2. 一个关键错误,随机附加在相同的url上,具有相同的参数

我错过了什么?

关于"ghost语句",原因只能是:代码在某种程度上仍然存在于应用程序中。。。或者一些高速缓存已经就位(例如,网络服务器中的Opcache或类似的东西)。

关于"关键错误",触发它的代码行是为实体创建条令代理的代码中的rename($tmpFileName, $fileName);。由于这只是一个文件重命名,这可能是缓存目录中的权限问题。

问题是Doctrine的代理类生成代码不能很好地处理并发请求。它适用于类似Unix的系统,但不适用于Windows,在Windows中,你不能只对打开的文件进行重命名。

参见条令捆绑包的配置。您最喜欢将auto_generate_proxy_classes设置为"%kernel.debug%"(这是symfony标准版中的默认设置)。

尝试将auto_generate_proxy_classes更改为false。如果更改实体,您现在必须手动清除缓存,但该错误应该会消失。