Показаны сообщения с ярлыком PHP. Показать все сообщения
Показаны сообщения с ярлыком PHP. Показать все сообщения

5 апр. 2015 г.

Проблемы с pecl

При попытке установить pecl дополнения возникла ошибка с получением информации о стандaртном репозитории pecl.php.net :

Cannot retrieve channel.xml for channel "pecl.php.net" (Connection to `pecl.php.net:443' failed: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?)

несмотря на то, что ssl в php включен и нормально работает. Обходным путем была установка при помощи pear:

# pear channel-discover pecl.php.net
# pear update-channels 
# pear install pecl.php.net/jsmin





8 июн. 2011 г.

сортированные массивы/JSON в JavaScript

Недавно мной был обнаружен баг при создании простой страницы: в различных браузерах проход по отсортированному массиву производится по разному( к слову - в FF проход идет нормальный, в Opera и Chrome - все идет не по плану).
Суть заключается в следующем:
на стороне сервера создается массив, сортируется по значениям в алфавитном порядке и передается во view:
$data = array();
 ....
asort($data, SORT_STRING);
$this->view->data = Zend_Json_Encoder::encode($data); // передаем во view наш массив, закодированный в json.

Во view обработка следующая (происходит заполнение тэга select при помощи js):
var data = data ?>;
for(t in data)
{
   el = $("");
   el.attr('label', data[t]);
   el.attr('value', t);
   $('#object_id').append(el);
}

В данном случае, не смотря на то, что массив JS заполнен отсортированными по значениям - не ключам - данными, браузеры проходят по массиву как хотят. Решением данной проблемы стал следующий костыль:
при заполнении массива на стороне сервера необходимо выравнивать длину ключей( в моем случае ключи были целочисленными) при помощи функции vsprintf, в результате чего происходит заполнение недостоющих символов пробелами( при обработке POST запроса - лишние пробелы собственоручно удаляются) :

$data = array();
 ....
asort($data, SORT_STRING);
$result = array();
foreach($data as $k => &$v)
{
$result[vsprintf("%10s", $k)] = $v;
 }
$data = $result;
$this->view->data = Zend_Json_Encoder::encode($data);
В качестве альтернативы ф-ции vsprintf можно использовать ф-цию str_pad.



24 сент. 2010 г.

Создание виртуального сервера для разработки

Для работы нам потребуется VMplayer и linux дистрибутив на основе которого мы будем поднимать наш сервер(для себя я выбрал Opensuse). При помощи VMplayera создаем новую виртуальную машину и в качестве CD-ROM указываем iso образ нашего дистрибутива, указываем ограничение на RAM в 256Мб(вполне хватает для работы apache и MySQL). При создании виртуальной машины vmplayer мне предложил автоматическую установку, но я отказался, т.к. он по дефолту поставил бы графическую оболочку. При установке выбираем графическую оболочку(X minimal - text mode) и необходимые пакеты(Apache, php, MySQL) и ждем завершения установки. После установки в настройках виртуальной машины выбираем shared folders и добавляем папку, в которой будут лежать наши проекты(в моем случае папка ~/projects и назвал я её local). Загружаем виртуальную машину, добавляем в /etc/fstab запись о shared folders:
.host:/local /mnt/hgfs vmhgfs rw,umask=0000 0 0
Лезем править конфигурационные файлы:
  • для apache лезем в  /etc/apache2/listen.conf и раскомментируем строку
    NameVirtualHost *:80
    - для работы виртуальных хостов
  •  для apache лезем в /etc/apache2 и добавляем строчку
    Include /mnt/hgfs/hosts/*.conf
    (для удобства - все конфигурационные файлы для apache лежат в ~/projects/hosts/)
Для корректной работы необходимо также разрешить firewall пропускать Apache и Mysql во внешний мир(~: yast2 -> Security & users -> firewall -> allowed services)
Перезагружаемся - вуаля - сервер работает.

Для полного счастья необходимо установить на сервер PHPMyAdmin и не обходимые модули для php, которые требует PMA(mcrypt, mbstring)

27 окт. 2009 г.

Преобразования JSON в PHP

Столкнулся с проблемой преобразования массива данных в PHP для передачи в формате JSON. В PHP есть ф-ция json_encode, но она работает только с данными в кодировке UTF-8, в результате чего пришлось кодировать данные при помощи самописной функции prepareDataForJson:

function prepareDataForJson(&$data)
{
if(is_array($data))
{
foreach(array_keys($data)as $k)
{
prepareDataForJson($data[$k]);
}
}else{
if(isset($data) && $data!='')
{
$data = htmlspecialchars($data);
$data = iconv('CP1251', 'UTF-8', $data);
}
}
}

и после этого передать в json_encode. Результат вывода был в виде \uXXXX, где ХХХХ - 4-х значный символ в UTF-16. Пришлось прогонять данные через самописную функцию unicode_decode :

function unicode_decode($str)
{
return preg_replace("/\\\u([0-9A-F]{4})/ie", "iconv('UTF-16', 'UTF-8',hex2str(\"$1\"))", $str);
}

function hex2str($hex)
{
return chr(hexdec($hex[2] . $hex[3])) . chr(hexdec($hex[0] . $hex[1]));
}


И только после данных преобразований получился требуемый JSON массив.