23 posts tagged

web

Later Ctrl + ↑

Мой первый раз с WordPress

За три года, что я работаю в web-разработке мне как-то удавалось избегать самого популярного в мире движка, не считая совсем мелких правок. Но мне приходилось слышать от коллег различные мнения от «Какое извращение превращать блог в магазин, форум и все, что угодно!» до «Вполне адекватная CMS для небольших проектов.» И вот предоставилась возможность поработать с WordPress воочию.

Первый блин

Надо сказать, что странности начались с самого начала. Оказалось, что в текущей версии прямо в ядро включена возможность функционирования в режиме «multisite», т.е. такой режим в котором на одной и той же копии движка работают несколько сайтов. Сам этот факт для меня весьма удивительный. Я могу представить себя ситуацию, при которой мне необходима будет такая система, но включать этот функционал в ядро? И тем более использовать его для размещения никак не связанных друг с другом сайтов, кроме того факта, что они принадлежат одной компании. Это мне не понятно.

Как и любая работа над сайтом, эта началась для нас с копирования сайта (точнее сайтов) на наш сервер и бекапа. Почему мы даже для мелких работ используем демо-версию сайта я напишу отдельно.

В переносе мультисайта мне помогли заметки SiteHint.ru и WP MAGAZINE. Как я понял, сложности связанные с этим давно известны сообществу WP и обсуждать их смысла нет. Наверное, этой заметки бы не было, если бы сайт «завелся» сразу после этого без проблем.

Настоящее веселье

Самое интересное началось, когда я думал, что перенос уже завершен успешно. Один из разделов (всего один и самый важный!) загружался не до конца. То есть просто в какой-то момент html код обрывался, как говорится «на самом интересном месте».

«Плавали, знаем», подумал я и стал искать, как включить ошибки. Перепробовал все, что можно от включения в конфиге, путем определения констант:

define(‘WP_DEBUG’, false);
define(‘WP_DEBUG_LOG’, true);
define(‘WP_DEBUG_DISPLAY’, false);

до прямых директив

ini_set(‘log_errors’,’On’);
ini_set(‘display_errors’,’Off’);
ini_set(‘error_reporting’, E_ALL );

Ничего ни на экране, ни в логах. Все чисто, но где-то работа скрипта обрывается.
«Уф», подумал я, и приступил к ковырянию в скриптах. Что бы не мучить читателя сразу расскажу о результатах расследования. Оказалось, что падает кеширование, а именно функция

update_meta_cache(‘post’, $post_ids);

А в ней проблема возникает во время запроса кэша из БД:

$meta_list = $wpdb->get_results( “SELECT $column, meta_key, meta_value FROM $table WHERE $column IN ($id_list) ORDER BY $id_column ASC”, ARRAY_A );

И, наконец, изучив объект $wpdb я нашел место падения

while ( $row = @mysqli_fetch_object( $this->result ) ) {
$this->last_result[$num_rows] = $row;
$num_rows++;
}

И тут же стала ясна причина отсутствия ошибок — оператор управления ошибками @. Выдержка из доков:
На сегодняшний день оператор “@” подавляет вывод сообщений даже о критических ошибках, прерывающих работу скрипта. Помимо всего прочего, это означает, что если вы использовали “@” для подавления ошибок, возникающих при работе какой-либо функции, в случае если она недоступна или написана неправильно, дальнейшая работа скрипта будет остановлена без каких-либо уведомлений.

Решение

Убрав собачку я увидел уже истинную причину проблем:

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 81 bytes) in /var/www/path_to_script/wp-db.php on line 1684

Временно забыть о проблеме с памятью удалось заменив в wp-config.php

define(‘WP_MEMORY_LIMIT’, ‘64M’);

На

define(‘WP_MEMORY_LIMIT’, ‘128M’);

Конечно, нужно искать причину, почему скрипт «жрет» столько оперативки, но это уже не срочно.

Как так

После всей это истории у меня остался один вопрос. Как так получилось, что самый популярный в мире движок, которым пользуются в том числе новички, не выводит ошибки? Возможно, там есть какая-нибудь своя функцию обработки ошибок с помощью set_error_handler(). Но мне не удалось нагуглить, как это все включить.

Пока эти вопросы остались для меня без ответа. Если что-то изменится, напишу продолжение поста.

P.S. Все вышесказанное о движке WordPress 4.1.8

 4   2015   web   программирование

Почему заказчики не любят пустое пространство

Я не дизайнер, но часто приходится «защищать» работу дизайнера перед заказчиком. Раз за разом я сталкиваюсь с тем что заказчик требует заполнить пустое место. Притом, на предварительном обсуждении все согласны с тем, что не нужно излишне захламлять и «чистый» и «светлый» сайт это здорово. Но вот наступает момент презентации дизайна и возникают вопросы — «а почему вот тут белое поле и нельзя ли его занять супер-важной для пользователя погодой?», «Черный текст на белом фоне это слишком просто — нужен какой-то фон, может все залить розовым?».
Думаю, что тут две различные по своей природе проблемы. Первая возникает из-за того, что у заказчика все время ощущение, что его обманывают. Не заполнили это место — им просто было лень. Расставили буквы «жиже» (увеличили интрельяж) — хотят заполнить текстом побольше места и не работать.
Другой пример той же проблемы: заказчик видит черный текст на белом фоне и думает, что, в принципе, может такое в ворде повторить за 10 минут. Значит не работали. Значит халтурили. Другое дело необычный шрифт на каком-то фоне — пусть не читаемо, но видно что работали.
Другая проблема связана с желанием заказчика решить сразу все вопросы, которые могут возникнуть у пользователей. «А если у них возникнет необходимость распечатать pdf? А если рассчитать кредит? А если посмотреть общий план? Надо что бы сразу показывались все варианты.» С одной стороны правильно, что все должно быть максимально близко и удобно, но напихивать все в один экран метод явно тупиковый.
У меня пока нет ответа, как решать эти проблемы априори.

 2   2015   web

Ubuntu, php и mssql

Возникла необходимость пересесть с уютного mysql на mssql. Делом это окзалось не таким уж и простым и полной инструкции в рунете я не нашел. У меня, как на ноуте, так и на сервере стоит убунта, так что напишу инструкцию для нее.
Для начала ставим модуль для php.
sudo apt-get install php5-sybase
После этого phpinfo() стал показывать блок mssql вот так:

Далее установим необходимые пакеты:
sudo aptitude install tdsodbc unixodbc odbc-bin php5-odbc

Настройка FreeTDS.
Для настройки FreeTDS нужно в конфигурационный файл /etc/freetds/freetds.conf добавить новую секцию для нашего M$ SQL сервера (название секции может быть любым):

[MsSQL]
host = sql.mydomen.ru
port = 1433
tds version = 8.0
client charset = WINDOWS-1251

где:
host — доменное имя или IP сервера с SQL.
tds version — версия протокола TDS, которая определяется по таблице. Версия 8.0 для Microsoft SQL Server 2000.
FreeTDS использует iconv для перекодирования потока. Если client charset не установлена, то перекодировка отключается и используется дефолтная ISO-8859-1. Эта переменная может принимать все кодировки библиотеки iconv.

Настройка ODBC.
Чтобы ODBC работала с FreeTDS нужно настроить драйвера, для этого скопируем файл описания драйверов из поставки FreeTDS /usr/share/freetds/odbcinst.ini в /etc/odbcinst.ini или, если /etc/odbcinst.ini уже существует и в нем есть записи других драйверов, добавим секцию для FreeTDS:

[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so
CPTimeout =
CPReuse =

Далее нужно настроить систему ODBC. Сделать это можно 2-мя путями:

Посредством графической утилиты ODBCConfig (из пакета odbc-bin).
Отредактировать файл /etc/odbc.ini, внеся в него соответствующие секции:

[SQLOnLine]
Description = FreeTDS
Driver = FreeTDS
Servername = MsSQL
Database = Report
UID = user
PWD = passwd
Port = 1433

где:
Description — описание драйвера.
Driver — имя раздела из файла /etc/odbcinst.ini.
Servername — имя раздела, описывающего сервер БД, из файла /etc/freetds/freetds.conf.
Database — имя базы данных на MS SQL сервере, к которой нужно получить доступ.
UID и PWD — пользователь, заведенный на MS SQL сервере.

Для проверки я использовал вот такой код:
echo «Testing...»;
if ($db = mssql_connect(‘ip:port’,’user’,’pass’)){;
echo $db;
mssql_select_db(‘BASE’, $db);
echo «connected to a database»;
mssql_close($db);
} else {
echo «connection failed»;
}
echo « end»;

Где
ip — адрес сервера
port — порт
user — имя пользователя для базы
pass — пароль
BASE — имя базы данных

Скрипт отработал и вывел в браузер
Testing...Resource id #1connected to a database end
Что значит, что все работает ок.

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