0

该网页位于 Symfony 2.5.2 上,包含 5 个自创包和 FOSUserbundle。它相当大,但本质上类似于带有用户评论的博客。

它位于共享的 OVH 服务器上。

它在 dev 和 prod 中有效,但在 prod 中:一到三天后,我要么收到 http 错误 500,要么(很少)收到 URL 为http://mypage.com/web//的空页面

后者表示尚未找到该路线。仍然必须存在路线,因为问题出现“一夜之间”,即间歇性出现。

当我遇到其中任何一种情况时,以下补救措施“解决”了问题:

  1. 清除缓存(我通常删除整个目录 app/cache/prod)
  2. 将 AppKernel 从 'prod',false 传递到 'prod',true(不清除缓存
  3. 传入 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 中弹出错误:

  1. 注意:未定义变量:匹配 /xxx/app/cache/prod/appProdUrlMatcher.php 第 84 行
  2. 警告:array_replace():参数 #1 不是第 84 行 /xxx/app/cache/prod/appProdUrlMatcher.php 中的数组
  3. 警告:在第 1414 行的 /xxx/app/cache/prod/classes.php 中为 foreach() 提供的参数无效
  4. 注意:未定义的索引:1966 行 /xxx/app/cache/prod/classes.php 中的 _route
  5. 注意:未定义变量:匹配 /xxx/app/cache/prod/appProdUrlMatcher.php 第 84 行
  6. 警告:array_replace():参数 #1 不是第 84 行 /xxx/app/cache/prod/appProdUrlMatcher.php 中的数组
  7. 警告:在第 1414 行的 /xxx/app/cache/prod/classes.php 中为 foreach() 提供的参数无效
  8. 注意:未定义索引: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) 上访问。

4

1 回答 1

0

Below the "repair" which succeeded to make the intermittent error disappear for one month now (before it occured every 2-4 days). It is the line in xxx/app/cache/prod/appProdUrlMatcher.php where I added simply $ee=3 which does nothing else than just defining $ee. NB: this php-file was generated automatically by the symfony cache system.

I have no explanation why, but the $ee=3 seems to do the trick.

// mysite_publish_artWork
if (0 === strpos($pathinfo, '/gallery/publish') && preg_match('#^/gallery/publish/(?P<idOfArtWork>[^/]++)$#s', $pathinfo, $matches)) {
$ee=3;
return $this->mergeDefaults(array_replace($matches, array('_route' => 'aliquam_publish_artWork')), array (  '_controller' => 'Aliquam\\ArtWorkBundle\\Controller\\ArtWorkController::publishArtWorkAction',));
}
于 2015-11-08T09:48:07.283 回答