Fenom + MobileDetect + NGINX + PHP5-FPM = 502 bad gateway

Здравствуйте.

Столкнулся с такой проблемой. У меня установлен Fenom, MobileDetect. Я разбил в чанке "layout" основную и мобильную версии тегами. Захожу на главную страницу — 502 ошибка. В логах nginx вот такое:

2015/08/24 13:24:23 [error] 9787#0: *216565 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: *2.**.*20.*9, server: kfm.****.kz, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-kfm2.sock:", host: "kfm.****.kz", referrer: "http://kfm.****.kz/manager/?a=element/template/update&id=1"
Пояндексил — пишут, что это из-за ошибки в PHP. Nginx как бы сообщает, что PHP не отдал ему ответ.

Самое интересное, когда отключаю плагин MobileDetect — всё работает. Помогите, пожалуйста, побороть эту неприятность.

Решение в комментариях.
Павел Гвоздь
24 августа 2015, 07:36
modx.pro
23
3 801
0
Поблагодарить автора Отправить деньги

Комментарии: 9

Павел Гвоздь
24 августа 2015, 10:49
0
Если кто-то сталкивался с этим, посоветуйте пожалуйста, как решить можно. Это очень важно, друзья, в ближайшее время.
    Василий Наумкин
    24 августа 2015, 12:45
    +1
    Я не сталкивался (и некогда проверять), но могу предположить, что всё дело в принципе работы MobileDetect. Он же берёт страницу во время рендера и вырезает куски, примерно в этот же момент, где-то там и Fenom парсит эту же страницу и судя по ошибке, возникает какой-то прям fatal error.

    Можно попробовать покомментировать строки в плагине MobileDetect, чтобы выяснить, в каком именно месте выходит ошибка, и подумать, как это обойти.

    Но у меня на это времени нет, уж извини.
      Павел Гвоздь
      24 августа 2015, 12:49
      0
      Как будет время покопаю, думаю. Пока решил проблему, вроде, небольшим костылём.
    Павел Гвоздь
    24 августа 2015, 12:48
    1
    +1
    Отключил в настройках плагин MobileDetect. Использую сниппет, который определяет средствами MobileDetect девайс, в сочетании с Феном. В начале чанка «layout» вставил такой код:
    <?php
    if( !$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/') ) {return;}
    
    
    $key = $MobileDetect->config['force_browser_variable'];
    
    $device = !empty($_GET) && array_key_exists($key, $_GET)
    		? $modx->stripTags($_GET[$key])
    		: '';
    
    if( empty($device) )
    {
    	$device = $MobileDetect->getSettings();
    }
    
    if( empty($device) )
    {
    	$detector = $MobileDetect->getDetector();
    	
    	if( $detector->isMobile() )
    	{
    		$return = 'mobile';
    	}
    	else {
    		$return = 'standard';
    	}
    }
    else {
    	$return = $device;
    }
    
    $MobileDetect->saveSettings( $return ); // ставим печеньку
    
    return $return;
    Внимание! Сниппет будет работать только с установленным компонентом MobileDetect.

    Советую, для корректной работы с мультиязыками использовать системную настройку «session_cookie_path». Значение данной настройки должно быть "/" (без кавычек).
      Василий Наумкин
      24 августа 2015, 12:50
      +1
      Вполне логичное и хорошее решение, учитывая возможности Fenom =)
        Павел Гвоздь
        24 августа 2015, 13:51
        1
        0
        Всё-же немного поторопился публиковать сниппет. Перед последней строкой return $return; должно быть вот это:
        $MobileDetect->saveSettings( $return );

        Итого, более правильный код сниппета вот:
        <?php
        if( !$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/') ) {return;}
        
        
        $key = $MobileDetect->config['force_browser_variable'];
        
        $device = !empty($_GET) && array_key_exists($key, $_GET)
        		? $modx->stripTags($_GET[$key])
        		: '';
        
        if( empty($device) )
        {
        	$device = $MobileDetect->getSettings();
        }
        
        if( empty($device) )
        {
        	$detector = $MobileDetect->getDetector();
        	
        	if( $detector->isMobile() )
        	{
        		$return = 'mobile';
        	}
        	else {
        		$return = 'standard';
        	}
        }
        else {
        	$return = $device;
        }
        
        $MobileDetect->saveSettings( $return ); // ставим печеньку
        
        return $return;

        Советую, для корректной работы с мультиязыками использовать системную настройку «session_cookie_path». Значение данной настройки должно быть "/" (без кавычек).
          Ilya Ev
          05 августа 2016, 20:27
          0
          Можно немного подробнее как использовать решение. Не совсем понятно. Куда и как вставлять код. Было бы здорово если бы можно было использовать что-то вроде

          {if $detector->isMobile()}
          
          {else}
          
          {/if}
            Володя
            05 августа 2016, 22:35
            21
            +5
            можно добавить так
            создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
            <?php
            switch ($modx->event->name) {
                case 'pdoToolsOnFenomInit':
                if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
                    return;
                }
                if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
            	    return;
                }
                
                $key = $MobileDetect->config['force_browser_variable'];
                $device = !empty($_GET) && array_key_exists($key, $_GET)
            		? $modx->stripTags($_GET[$key])
            		: '';
            	if (empty($device)) {
            	    $device = $MobileDetect->getSettings();
                }
                if (empty($device)) {
                    $detector = $MobileDetect->getDetector();
                    $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
                    $MobileDetect->saveSettings($device);
                }
            
                $fenom->addModifier("detector", function ($value) use ($device) {
                    return $value == $device;
                });
            
                break;
            }

            и теперь в любом месте можно делать так
            {if 'mobile'|detector}
            mobile
            {/if}
            
            {if 'tablet'|detector}
            tablet
            {/if}
            
            {if 'standard'|detector}
            standard
            {/if}
              Ilya Ev
              05 августа 2016, 22:37
              0
              О круто спасибо большое, пошел тестировать)
                Владимир
                06 августа 2016, 06:46
                0
                Супер. В закладки! )))
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10