среда, 28 января 2009 г.

Работа из PHP с xmpp (jabber)

Работа над протоколом jabber была начата ещё в 1998 году, но более широкое распространение получил в середине 2000 года. С того времени появилось много библиотек и реализаций данного протокола, почти для всех языков программирования. Более детальный список можно посмотреть на оффсайте: http://xmpp.org/software/libraries.shtml.

Extensible Messaging and Presence Protocol, сокращённо XMPP, это открытый протокол, основанный на XML, предназначенный для обмена мгновенными сообщениями и информацией о присутствии (списке контактов, например). Был опубликован в виде RFC 3920. Он остаётся основным протоколом технологии обмена мгновенными сообщениями Jabber. Главной целью протокола – была расширяемость, таким образом, он быстро получил много дополнительных возможностей, такие как передача голоса или передача файлов.

На оффсайте набор библиотек для работы на PHP представлен тремя вариантами:

  • JAXL
  • Lightr
  • xmpphp

Больше всего приглянулась библиотека xmpphp, как самая простая в использовании и с довольно удобными вызовами. О ней и пойдёт разговор.

Для того чтобы начать её использовать необходимо подключить файл XMPP.php, перед началом работы. Дальше создать объект класса XMPPHP_XMPP с указанием основных параметров соединения: джаббер сервера, порта подключения, данных для авторизации, и уровня логирования.

Фрагмент кода приведен ниже.

include ‘XMPPHP/XMPP.php’;

$conn = new XMPPHP_XMPP('jabber_server_here', 5222, 'your_login', ' your_password', 'xmpphp', 'jabber.ru', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
$conn->useEncryption(false);        //disable encryption
try
{
    $conn->connect();
    $conn->processUntil('session_start');
    $conn->presence();
    $conn->message('your jabber here', 'текст сообщения, которое хотите отправить');
    $conn->disconnect();
}
catch(XMPPHP_Exception $e)
{
    //here you can process $e->getMessage() if some error occurred;
}

В примере было отключено шифрование командой $conn->useEncryption(false). Это нужно делать непосредственно перед вызовом метода connect, пока не было установлено соединение. Позволит решить проблему, если вы получили ошибку вида «Fatal error: Cannot access protected property XMPPHP_XMPP::$use_encryption …», или в случае, если вы хотите отключить SSL/TLS шифрование.

Данное решение, использовать джаббер для отсылки сообщений средствами PHP, может пригодится для отправки извещения вам прямо в messenger об очередном пришедшем комментарии с вашего форума, заказе на покупку из web-магазина, поста из агрегатора новостей или другой важной информации с вашего приложения на сервере.

понедельник, 5 января 2009 г.

asort() – SORT_NUMERIC with non numeric values

Я уже подымал тему сортировок в своём блоге, но придется затронуть ещё одно, казалось бы, «ровное» место. Стояла задача сортировки массива данных по float значению, прямая или обратная, без разницы, но при этом надо было сохранить соотношение ключей и значений.

В PHP есть такая замечательная функция asort() и arsort() для сортировки в обратном порядке. Она позволяет производить сортировку данных в массиве, при этом оставляя соотношение ключей и значений неизменным. Собственно, это и требовалось для нашей задачи.

asort($arr, $sort_flags);

В качестве первого параметра передал массив для сортировки, в качестве ключей сортировки указал $sort_flags=SORT_NUMERIC. Отсортировал, вывел данные в таблицу для отображения. Как ни странно, но данные вывелись не в отсортированном порядке. Так как выборка данных была не большая, то смог заметить, что порядок следования всё-таки хаотично поменялся.

Так как ломаться было нечему, функция небольшая, то сразу понял, что проблема была где-то в участке кода с использованием функции asort(). Создал ассоциативный массив из 25 элементов, в котором ключами были простые числа в порядке следования, а в качестве значений были нехитро сгенерированные float числа. Получился следующий массив:

Array
(
  [0] => 0.00
  [1] => 0.00
  [2] => 0.00
  [3] => 55.00
  [4] => 0.00
  [5] => 1.00
  [6] => 0.00
  [7] => 0.00
  [8] => 0.00
  [9] => 0.00
  [10] => 0.00
  [11] => 1.00
  [12] => 0.95
  [13] => 1.00
  [14] => 1.00
  [15] => 0.00
  [16] => 0.00
  [17] => 0.00
  [18] => 0.00
  [19] => 0.00
  [20] => 0.00
  [21] => 0.00
  [22] => 0.00
  [23] => 8.00
  [24] => 0.00
)

После сортировки функцией asort() с ключём SORT_NUMERIC получил следующий результат:

Array
(
  [23] => 8.00
  [3] => 55.00
  [5] => 1.00
  [11] => 1.00
  [14] => 1.00
  [13] => 1.00
  [12] => 0.95
  [22] => 0.00
  [7] => 0.00
  [18] => 0.00
  [4] => 0.00
  [6] => 0.00
  [1] => 0.00
  [19] => 0.00
  [17] => 0.00
  [20] => 0.00
  [10] => 0.00
  [21] => 0.00
  [16] => 0.00
  [15] => 0.00
  [2] => 0.00
  [24] => 0.00
  [8] => 0.00
  [9] => 0.00
  [0] => 0.00
)

И после этого прозрел о_О. Почему элементы не в отсортированном порядке? Пошёл смотреть в PHP-мануал. Но, ни слова не сказано, что функция не будет работать с float числами, она должна одинаково хорошо работать как со string-ами, так и с integer или float объектами для сортировки, для этого лишь нужно использовать соответсвующий ключ сортировки. Для численных параметров нужно использовать именно SORT_NUMERIC, впрочем, как мы и делали. Ладно, попробовал отсортировать в реверсивном порядке при помощи arsort(), а потом просто перевернуть массив. Но результат был аналогичен – НЕ РАБОТАЕТ.

Версия PHP, на котором запускалось – Version 5.2.3.

Any ideas?

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting