我正在使用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)"} []
因此,连续出现两个问题:
- 对幽灵陈述的呼唤
- 一个关键错误,随机附加在相同的url上,具有相同的参数
我错过了什么?
关于"ghost语句",原因只能是:代码在某种程度上仍然存在于应用程序中。。。或者一些高速缓存已经就位(例如,网络服务器中的Opcache或类似的东西)。
关于"关键错误",触发它的代码行是为实体创建条令代理的代码中的rename($tmpFileName, $fileName);
。由于这只是一个文件重命名,这可能是缓存目录中的权限问题。
问题是Doctrine的代理类生成代码不能很好地处理并发请求。它适用于类似Unix的系统,但不适用于Windows,在Windows中,你不能只对打开的文件进行重命名。
参见条令捆绑包的配置。您最喜欢将auto_generate_proxy_classes设置为"%kernel.debug%"(这是symfony标准版中的默认设置)。
尝试将auto_generate_proxy_classes更改为false。如果更改实体,您现在必须手动清除缓存,但该错误应该会消失。