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}
О круто спасибо большое, пошел тестировать)
Супер. В закладки! )))
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.