При попытке установить 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:
Недавно мной был обнаружен баг при создании простой страницы: в различных браузерах проход по отсортированному массиву производится по разному( к слову - в 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)
{
В данном случае, не смотря на то, что массив 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.
Для работы нам потребуется 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)
Столкнулся с проблемой преобразования массива данных в 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);
}