该网页位于 Symfony 2.5.2 上,包含 5 个自创包和 FOSUserbundle。它相当大,但本质上类似于带有用户评论的博客。
它位于共享的 OVH 服务器上。
它在 dev 和 prod 中有效,但在 prod 中:一到三天后,我要么收到 http 错误 500,要么(很少)收到 URL 为http://mypage.com/web//的空页面
后者表示尚未找到该路线。仍然必须存在路线,因为问题出现“一夜之间”,即间歇性出现。
当我遇到其中任何一种情况时,以下补救措施“解决”了问题:
- 清除缓存(我通常删除整个目录 app/cache/prod)
- 将 AppKernel 从 'prod',false 传递到 'prod',true(不清除缓存
- 传入 app_dev.php
我不知道案例 2 是否也会出现间歇性(因为我不想冒着让网站以这种方式打开的风险)。对于案例 3:在没有清除缓存的情况下返回 prod 时,问题仍然存在。
当我收到错误 500 时,日志文件中没有条目。
每当我检查时收到空页面错误(URL 以 web// 结尾)时,日志文件都没有条目;但是几个小时前有一个条目(我想是来自访客)表明:
[2015-07-23 04:04:18] request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException: "No route found for "GET /dir1/dir2/fr"" at /home/mysite/www/Symfony/app/cache/prod/classes.php line 1977 {"exception":"[object] (Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException: No route found for \"GET /dir1/dir2/fr\" at /home/mysite/www/Symfony/app/cache/prod/classes.php:1977, Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException: at /home/mysite/www/Symfony/app/cache/prod/appProdUrlMatcher.php:545)"} []
我努力了
添加 web/app.php 一个
$response->setMaxAge(600);
也表现出间歇性错误(再次删除它)在主页控制器中添加自动缓存删除(我的辩护:这不是一个解决方案,但仅用于调试)。在间歇性保持静止后再次将其移除。
//---------- clears cache first user at midnight $dirDate=date('d',filemtime($this->container->getParameter('kernel.cache_dir'))); if (date('d') != $dirDate AND date('H')<6) { //--- from http://stackoverflow.com/questions/24115395/programmatically-clear-cache-on-symfony-2 $fs = new Filesystem(); $fs->remove($this->container->getParameter('kernel.cache_dir'));}
我试图添加
$kernel = new AppCache($kernel);
web/app.php 但根本无法让它工作(因为它超出了我的能力范围)。
我无法继续每天(或更频繁地?)手动清除缓存,并且问题的间歇性特征不允许典型的试错调试 excersize。在继续采取“盲目”行动之前,我需要帮助了解原因。
我当然可以分享更多的编码,但不知道在这里与社区分享哪一部分。可能没有“典型”错误,因为代码总是工作一段时间,并且问题仅在 1 到 3 天后间歇性地弹出。
Francesco评论后的附加组件:
Symfony 的应用程序/日志中的日志文件没有错误,但我在(共享)服务器的日志(logs.ovh.net)中发现了一些错误。尽管如此,这些日志只是 500 错误的结果。有两条不同的消息(每条消息都有很多):
[Sat Jul 25 23:29:07 2015] [error] [client 66.249.64.104] [host www.mywebsite.com] FastCGI: comm with server "/homez.437/myweb/www/Symfony/web/app.php" aborted: idle timeout (300 sec)
[Sat Jul 25 23:29:07 2015] [error] [client 66.249.64.104] [host www. mywebsite.com] FastCGI: incomplete headers (0 bytes) received from server "/homez.437/myweb/www/Symfony/web/app.php"
[Sat Jul 25 23:29:07 2015] [error] [client 66.249.64.104] [host www. mywebsite.com] FastCGI: An error happend on Fastcgi processing, fallback to CGI
[Sat Jul 25 23:29:10 2015] [error] [client 66.249.64.104] [host www. mywebsite.com] (103)Software caused connection abort: Failed to flush CGI output to client
[Sat Jul 25 22:35:58 2015] [error] [client 66.249.64.94] [host www. mywebsite.com] (104)Connection reset by peer: FastCGI: comm with server "/homez.437/myweb/www/Symfony/web/app.php" aborted: read failed
[Sat Jul 25 22:35:58 2015] [error] [client 66.249.64.94] [host www. mywebsite.com] FastCGI: incomplete headers (0 bytes) received from server "/homez.437/myweb/www/Symfony/web/app.php"
[Sat Jul 25 22:35:58 2015] [error] [client 66.249.64.94] [host www. mywebsite .com] FastCGI: An error happend on Fastcgi processing, fallback to CGI
共享服务器上记录的错误发生在我可以毫无问题地访问该网站时。这意味着什么?
第一次修订后 3 个月更新问题陈述:
我终于设法通过将以下代码添加到 app.php 来检索错误代码(第一次“使用”之前的代码顶部):
ini_set('display_errors', 1);
error_reporting(-1);
然后在站点 uri 下的 html 中弹出错误:
- 注意:未定义变量:匹配 /xxx/app/cache/prod/appProdUrlMatcher.php 第 84 行
- 警告:array_replace():参数 #1 不是第 84 行 /xxx/app/cache/prod/appProdUrlMatcher.php 中的数组
- 警告:在第 1414 行的 /xxx/app/cache/prod/classes.php 中为 foreach() 提供的参数无效
- 注意:未定义的索引:1966 行 /xxx/app/cache/prod/classes.php 中的 _route
- 注意:未定义变量:匹配 /xxx/app/cache/prod/appProdUrlMatcher.php 第 84 行
- 警告:array_replace():参数 #1 不是第 84 行 /xxx/app/cache/prod/appProdUrlMatcher.php 中的数组
- 警告:在第 1414 行的 /xxx/app/cache/prod/classes.php 中为 foreach() 提供的参数无效
- 注意:未定义索引:112行/xxx/vendor/symfony/symfony/src/Symfony/Component/Security/Http/HttpUtils.php中的_route
appProdUrlMatcher.php 的第 82 到 85 行是
// mysite_publish_artWork
if (0 === strpos($pathinfo, '/gallery/publish') && preg_match('#^/gallery/publish/(?P<idOfArtWork>[^/]++)$#s', $pathinfo, $matches)) {
return $this->mergeDefaults(array_replace($matches, array('_route' => 'aliquam_publish_artWork')), array ( '_controller' => 'Aliquam\\ArtWorkBundle\\Controller\\ArtWorkController::publishArtWorkAction',));
}
注意:第 84 行是以 return $this-> 开头的行
当我简单地添加一个 CRLF (Notepad++) 时,上面的代码如下所示:
// mysite_publish_artWork
if (0 === strpos($pathinfo, '/gallery/publish') && preg_match('#^/gallery/publish/(?P<idOfArtWork>[^/]++)$#s', $pathinfo, $matches)) {
return $this->mergeDefaults(array_replace($matches, array('_route' => 'mysite_publish_artWork')),
array ( '_controller' => 'MySite\\ArtWorkBundle\\Controller\\ArtWorkController::publishArtWorkAction',));
}
然后错误 500 消失并加载页面。
这个 appProdUrlMatcher.php 不是我创建的类;它是 symfony 创建的缓存的一部分。当然,我可以删除它,然后它会工作一段时间,直到错误再次弹出。
该路由是到(安全的,仅限管理员访问)控制器的路由。虽然所有这些间歇性问题都发生了,但我没有一次打电话给这条路线。注意:当我以管理员身份调用路由时,它确实有效。这是路线的 yml:
mysite_publish_artWork:
pattern: /publish/{idOfArtWork}
defaults: { _controller: MysiteArtWorkBundle:ArtWork:publishArtWork }
requirements:
idOfArtWork: \d+
和对应的控制器
public function publishArtWorkAction($idOfArtWork)
{
$em=$this->getDoctrine()->getManager();
$repository=$em->getRepository('AliquamArtWorkBundle:ArtWork');
$artWork=$repository->find($idOfArtWork);
$listOfArtWork=$repository->findAll();
if (isset($idOfArtWork))
{
if ($artWork->getPublicate()==true){$published=false;}else{$published=true;}
$csrfProvider = $this->container->get('form.csrf_provider');
$unique_fake = $csrfProvider->generateCsrfToken('unique_fake');
if ($this->getRequest()->query->get('csrf_unique_fake')==$unique_fake)
{
$artWork->setPublicate($published);
$em->persist($artWork);
$em->flush();
$translatedText = $this->get('translator')->trans('message.flash.modified');
$this->get('session')->getFlashBag()->set('infoGlobal',$translatedText);
}
foreach ($listOfArtWork as $l)
{
$l->setContent(substr($l->getContent(),0,25)."...");
}
}
return $this->redirect($this->generateUrl('mysite_manage_artwork'));
}
我可以删除/清除缓存,但是在 cache/prod/ 中重写文件真的有意义吗?我不认为这是个好主意。但我缺少其他任何东西。
而且,今天发生的事情:我可以在我的 PC 上访问该站点,但不能在我的手机 (Windows Phone) 上访问。