четверг, 1 августа 2013 г.

Как побороть ошибку phpThumb в MODx [OutputThumbnail() failed because !is_resource($this->gdimg_output)]

У очень многих людей, установивших MODx Revolution, возникает проблема с тем, что не показываются превью к картинкам в файловом редакторе, при этом в файле error.txt (Reports->Error log, а в русской версии Отчёт->Журнал ошибок) появляется ошибка типа:
[2013-08-01 00:02:25] (ERROR @ /connectors/system/phpthumb.php) phpThumb was unable to generate a thumbnail for: /var/www/core/cache/phpthumb/phpThumb_cache_site.ru_srcdc8485f6e9b68beb8824f8f795acc2e7_par02a1b054e8467fb1e234c8a8fd8d10d2_dat1375288827.png
[2013-08-01 00:02:25] (ERROR @ /connectors/system/phpthumb.php) Error outputting thumbnail:
OutputThumbnail() failed because !is_resource($this->gdimg_output) in file "phpthumb.class.php" on line 557
В сообществе MODx предлагается несколько способов борьбы с этим (сразу скажу, они мне не помогли и я нашел своё решение) :

  1. Разрешить использование файлов, расположенных НЕ в корневой директории. Для этого идём в настройки и ищем ключ "setting_phpthumb_allow_src_above_docroot", устанавливаем его в True (Да).


  2. В этом варианте, нужно проверить правильно ли у вас установлены права на папку core/cache/phpthumb, если директории phpthumb нету вообще, значит установлены маленькие права на папку cache.
    Самое простое, на короткое время тестирования, установить на все три директории (core / cache / phpthumb) полные права — 0777. Это позволит вам сразу понять есть ли проблема в правах на директории. 0777 это максимальные права, устанавливать их на долгое время настоятельно не рекомендуется. Если phpThumb заработает, то начните уменьшать права на папки по очереди (сначала на core, потом на cache) и найдите то сочетание прав, при которых phpThumb продолжает работать.

  3. Многие устанавливают на хостинг PHP-оптимизатор eAccelerator, который так же может приводить к проблемам с генерацией превью картинок. Для отключения eAccelerator, найдите файл eaccelerator.ini (в Debian он находится по пути /etc/php5/conf.d/) и закоментируйте строчку:
    extension="eaccelerator.so"
    должно получиться вот так:
    ;extension="eaccelerator.so"
    после этого перезагрузите Apache, командой:
    service apache2 restart

  4. Лично мне все эти способы не помогли. Причина проблемы у меня была в том, что в файле php.ini не было точно указано выделяемое количество памяти (параметр memory_limit), т.е. значение было — -1. Я проставил выставил значение
    memory_limit = 128M
    и всё заработало!

вторник, 25 июня 2013 г.

Боремся с ошибкой fsockopen(): unable to connect to ssl://smtp.googlemail.com:465 (PHP-не хочет отправлять почту через GMail)

Пришлось перенести сайт на новый хостинг. После переноса перестала отправляться почта из скриптов. Для отправки использовалась библиотека PHPMailer, а сама почта отправляется через аккаунт Gmail. Начал читать логи и увидел такую ошибку:
PHP Warning:  fsockopen(): unable to connect to ssl://smtp.googlemail.com:465 
 В интернете советуют изменить протокол и вместо SSL указывать TLS и изменить порт на 587, но это ничего не изменило.

Возникла мысль, что каким-то образом блокируется попытка связи с smtp.google.com, проверил соединение из терминала командами:
telnet smtp.gmail.com 465
и
openssl s_client -connect smtp.gmail.com:465
Подключения прошли успешны, значит дело не в блокировках.

А проблема оказалась в том, что в PHP 5.3 имеется баг, который приводит к такой ошибке, если на сервере включена поддержка IPv6. Есть два метода борьбы:

  1. Указать в настройках PHPMailer не домен SMTP-сервера, а его IP-адрес.
  2. Прописать в /etc/hosts соответствие домена IP-адресу.
  3. Отключить IPv6 на сервере.
Я выбрал третий вариант, т.к. первые два могут принести много проблем, если IP-адрес сервера изменится. У меня на сервере стоял Debian 7 (для Debian 6 все аналогично), для него отключение IPv6 довольно просто:
sudo echo net.ipv6.conf.all.disable_ipv6=1 > /etc/sysctl.d/disableipv6.conf
И для надежности перезагрузиться (выполнив: sudo reboot). Если вдруг понадобиться вернуть поддержку IPv6, то нужно просто удалить файл /etc/sysctl.d/disableipv6.conf.

На сегодня всё!

вторник, 18 июня 2013 г.

Gmail: пересылка всех писем, включая спам, на другой ящик.

Многие в своей работе используют несколько gmail-аккаунтов. Постоянное переключение между ящиками создают массу неудобств и на это тратится куча времени. Google пошел на встречу пользователям с несколькими аккаунтами gmail-почты и сделал несколько вариантов аккумулирования почты из нескольких почтовых ящиков ("дочерних") в один "основной" (путем пересылки или сбора почты). К сожалению, в мире еще нет совершенства и многие нужные письма (привет письмам со ссылкой на скачку Денвера) все еще попадают в папку Спам. А логика работы GMail такова, что спам-письма не пересылаются и не "отдаются" при сборке почты через POP.

Далее речь пойдет о "дочернем" ящике, т.е. том, из которого письма пересылаются в основной.

Т.к. "в лоб" обойти спам-фильтр нельзя, то воспользуемся другой мощной функцией - Фильтрами.
Чтобы создать фильтр, нужно немного вникнуть в работу почтовой системы в борьбе со спамом, а там все просто - входящие письма проходят через спам-фильтр на почтовом сервере, где им ставится флаг "спам" или "не спам", на основе этого флага, gmail применяет ярлык "Спам" к письму и мы можем их видеть в почтовом интерфейсе:
К ярлыку "Спам" можно быстро добраться, введя в поиске "is:spam" или "label:spam"

Итак, идём в "Настройки" (нажав значок с шестеренкой, в правом верхнем углу и выбрав соответствующий пункт меню).

Далее выбираем вкладку "Фильтры" и кликаем "Создать новый фильтр".

В поле "Содержит слова" пишем — label:spam
Кликаем ниже ссылку "Создать фильтр в соответствии с этим запросом" (нам выдадут предупреждение — согласимся) и на следующем шаге устанавливаем галочку "Никогда не отправлять в спам". Нажимаем кнопку "Создать фильтр".


Теперь, после создания этого фильтра, весь спам у нас будет попадать во "Входящии", что минус, но при этом абсолютно все письма будут пересылаться на основной ящик, что плюс. Так же, полученные, после пересылки, письма НЕ будут попадать в спам в "основном" ящике.