Fenom + MobileDetect + NGINX + PHP5-FPM = 502 bad gateway
        Здравствуйте.
Столкнулся с такой проблемой. У меня установлен Fenom, MobileDetect. Я разбил в чанке "layout" основную и мобильную версии тегами. Захожу на главную страницу — 502 ошибка. В логах nginx вот такое:
Самое интересное, когда отключаю плагин MobileDetect — всё работает. Помогите, пожалуйста, побороть эту неприятность.
Решение в комментариях.
    
    
                                                        Столкнулся с такой проблемой. У меня установлен 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 — всё работает. Помогите, пожалуйста, побороть эту неприятность.
Решение в комментариях.
            
                Поблагодарить автора            
            
                 Отправить деньги            
        
        
            Комментарии: 9
                Если кто-то сталкивался с этим, посоветуйте пожалуйста, как решить можно. Это очень важно, друзья, в ближайшее время.            
                    
                Я не сталкивался (и некогда проверять), но могу предположить, что всё дело в принципе работы MobileDetect. Он же берёт страницу во время рендера и вырезает куски, примерно в этот же момент, где-то там и Fenom парсит эту же страницу и судя по ошибке, возникает какой-то прям fatal error.
Можно попробовать покомментировать строки в плагине MobileDetect, чтобы выяснить, в каком именно месте выходит ошибка, и подумать, как это обойти.
Но у меня на это времени нет, уж извини.
                    Можно попробовать покомментировать строки в плагине MobileDetect, чтобы выяснить, в каком именно месте выходит ошибка, и подумать, как это обойти.
Но у меня на это времени нет, уж извини.
                Как будет время покопаю, думаю. Пока решил проблему, вроде, небольшим костылём.            
                    
                Отключил в настройках плагин MobileDetect. Использую сниппет, который определяет средствами MobileDetect девайс, в сочетании с Феном. В начале чанка «layout» вставил такой код:
Советую, для корректной работы с мультиязыками использовать системную настройку «session_cookie_path». Значение данной настройки должно быть "/" (без кавычек).
                    <?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». Значение данной настройки должно быть "/" (без кавычек).
                Вполне логичное и хорошее решение, учитывая возможности Fenom =)            
                    
                Всё-же немного поторопился публиковать сниппет. Перед последней строкой return $return; должно быть вот это:
Итого, более правильный код сниппета вот:
Советую, для корректной работы с мультиязыками использовать системную настройку «session_cookie_path». Значение данной настройки должно быть "/" (без кавычек).
                    $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». Значение данной настройки должно быть "/" (без кавычек).
                Можно немного подробнее как использовать решение. Не совсем понятно. Куда и как вставлять код. Было бы здорово если бы можно было использовать что-то вроде
                    {if $detector->isMobile()}
{else}
{/if}            
                можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
и теперь в любом месте можно делать так
                    создать плагин на 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}            
                О круто спасибо большое, пошел тестировать)            
                    
                Супер. В закладки! )))            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.