2015-07-25 21 views
0

Веб-страница находится на Symfony 2.5.2 с 5 самосозданными пакетами и FOSUserbundle. Он довольно большой, но по сути напоминает блог с комментариями пользователей.Неопределенная переменная: соответствует в .. /app/cache/prod/appProdUrlMatcher.php on line .. прерывистый выпуск

Он находится на общем сервере OVH.

Он работает в разработчика и прод, но когда в прод: после того, как один-три дня я либо получаю ошибку HTTP 500 или (реже) пустую страницу с URL http://mypage.com/web//

Последнее указывает на то, что маршрут не было найдено. Все еще маршрут ДОЛЖЕН быть там, так как проблема появляется «за ночь», то есть с перерывами.

Когда я либо один из этих ситуаций следующие средства правовой защиты «решить» проблему:

  1. Очистить кэш (я обычно удалить все приложения каталог/кэш/Prod)
  2. передать AppKernel от «прод», ложно «прод», правда (без очистки кэша
  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)"} [] 

Я попытался

  • добавить в Сети/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); в веб/app.php, но не мог заставить его работать на всех (как это вне моей компетенции).

Я не могу продолжать вручную очистить кэш каждый день (или чаще?) И прерывистый характер проблемы не позволяет типичных проб и ошибок отладки excersize. Мне нужна помощь, чтобы понять причину, прежде чем продолжать принимать «слепые» действия.

Я могу, конечно, поделиться большей частью кодировки, но не знаю, какую часть поделиться с сообществом здесь. Вероятно, нет «типичной» ошибки, так как код всегда работает некоторое время, и проблема ТОЛЬКО появляется через 1-3 дня, с перерывами.

Дополнительный после комментария Франческо:

Там нет ошибки в файле журнала в приложении 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 месяца после первой REV:

я, наконец, удалось получить код ошибки, добавив следующий код в app.php (верхняя часть кода перед первым использованием «») :

ini_set('display_errors', 1); 
error_reporting(-1); 

ошибка затем всплывает в HTML под Ури сайта:

  1. Notice: Undefined переменной: матч es в /xxx/app/cache/prod/appProdUrlMatcher.php в строке 84
  2. Предупреждение: array_replace(): Аргумент # 1 не является массивом в /xxx/app/cache/prod/appProdUrlMatcher.php в строке 84
  3. Предупреждение: неверный аргумент, предоставленный foreach() в /xxx/app/cache/prod/classes.php в строке 1414
  4. Примечание: Неопределенный индекс: _route в /xxx/app/cache/prod/classes.php on линия 1966
  5. Примечание: Undefined переменной: матчи в /xxx/app/cache/prod/appProdUrlMatcher.php по линии 84
  6. Предупреждение: array_replace(): Аргумент # 1 не является массивом в/ххх/приложение/кэш /prod/appProdUrlMatcher.php в строке 84
  7. Предупреждение: Недействительный аргумент, предоставленный foreach() в /xxx/app/cache/prod/classes.php в строке 1414
  8. Примечание: Неопределенный индекс: _route in/xxx/vendor/symfony/symfony/src/Symfony/Компонент/Безопасность/Http/HttpUtils.php на линии 112

линия 82 до 85 из appProdUrlMatcher.php являются

// 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',)); 
    } 

NB: линия 84 является линией, начиная с возвращения $ 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. Конечно, я могу удалить его, и он будет работать некоторое время, пока ошибка не появится снова.

Маршрут - это маршрут к контроллеру (обеспеченному, только администратору). в то время как все эти прерывистые проблемы произошли, я не назвал маршрут один раз. NB: когда я вызываю маршрут как администратор, он работает. Вот 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'));  
    } 

я могу удалить/очистить кэш, но он будет делать на самом деле смысл переписать файл в кэш/прод/? Я не думаю, что это хорошая идея. Но у меня нет другого.

И что-то, что произошло сегодня: я могу получить доступ к сайту на своем ПК, но не на своем мобильном телефоне (Windows Phone).

+0

Немного не по теме, но вы можете обновиться до Symfony 2.5.12, который является последним relese в серии 2.5.x. Тем не менее, информация о 500 ошибках ДОЛЖНА отслеживаться где-то. Когда происходит ошибка, попробуйте увеличить уровень ошибок PHP, например. в самом файле app.php. –

ответ

0

Ниже «ремонт», в результате которого прерывистая ошибка исчезла в течение одного месяца (до того, как она произошла каждые 2-4 дня). Это строка в xxx/app/cache/prod/appProdUrlMatcher.php , где я добавил просто $ ee = 3, который делает не что иное, как просто определение $ ee. NB: этот php-файл был сгенерирован автоматически системой кэширования symfony.

У меня нет объяснений, почему, но $ ee = 3, похоже, делает трюк.

// 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',)); 
}