PDO_OCI: Не выбирается Clob при работе в связке nginx+php-fpm
При переносе проекта с apache+mod_php на nginx+php-fpm, столкнулся с довольно непонятной проблемой при работе с Ораклом через PDO. Дело в том что, как я писал раннее, чтобы выбрать значение *LOB поля из Оракла, нужно сделать определенные манипуляции, и получив при fetch’e php_stream, сами данные получить путем stream_get_contents. Так вот, один и тот-же код под apache возвращает валидный stream, и соответственно все хорошо работает, а под nginx + php-fpm - пустую строку. Где копать непонятно, гугл очень немного знает про связку оракл+pdo+php-fpm, не говоря уже об nginx. Может быть у кого-то есть идеи?
Код такой:
function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date,owner_id from news where id=:id");
$newsq->execute(array(":id" => $id));
$data = $newsq->fetch(PDO::FETCH_OBJ);
$data->NEWS_BODY = stream_get_contents($data->NEWS_BODY);
return $data;
}
если последовать мануалу, и добавить туда bindParam() таким образом:
function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date,owner_id from news where id=:id");
$newsq->execute(array(":id" => $id));
#$newsq->bindColumn(3, $lob, PDO::PARAM_LOB);
$data = $newsq->fetch(PDO::FETCH_OBJ);
$data->NEWS_BODY = stream_get_contents($lob);
return $data;
}
то php-fpm вообще вылетает с дампом памяти в логе, и ошибкой OCI-21500, которая по сути является “внутренней ошибкой без описания”. Вобщем вилы, куда копать непонятно, но врагу не сдается наш гордый варяг ))
Если кто-то в курсе, или работал в такой связке - помогите пожалуйста )))
PHP+Oracle Faq
http://download-west.oracle.com/otndocs/tech/ias/portal/files/RG/completewebsitephpfaq2.htm Полезнейший FAQ от ораклов, о том как их чудо-продукт всетаки заставить работать с похапе.
На заметку.
Хозяйке на заметку, или кратко об очевидном, кажущимся неочевидным
Отсутствующие локали
При отсутствии на сервере нужной локали, например ru_RU.CP1251, можно легко её добавить:
localedef ru_RU.CP1251 -i ru_RU -f CP1251
после этого проверяем, появилась ли она, командой
locale -a | grep ru
Переменные окружения
Как известно, большая часть неочевидных проблем в линуксе связана с переменными окружения. Чтобы понять, как так случилось что из консоли ваш демон запускается и работает правильно, а при запуске из init.d что-то не так (например у меня переставал коннектиться к Ораклу, или слетала локаль), достаточно сделать тестовый вывод переменных среды окружения в инит скрипте.
На примере стартового скрипта php-fpm, добавляем в него после #/bin/bash следующую строку:
export > /tmp/envvars и перезагружаемся. Смотрим что там есть, перегружаем руками и смотрим что изменилось. Делаем выводы каких переменных окружения не хватает, и добавляем их прямо в тестовый скрипт. Не слишком красиво, но чаще всего достаточно и такого решения.
Rewrite Rule для CodeIgniter и nginx
В интернетах куча вариантов этих rewrite-rule’ов, у меня же заработал такой вариант (полный конфиг vhost’а):
server {
listen 80;
server_name yourhost.com;
index index.php;
root /www/yourhost.com/htdocs;
access_log logs/yourhost.com_access.log;
location / {
#error_page 404 = 404.html;
if (-f $request_filename) {
expires max;
break;
}
if ($request_filename !~ (js|css|images|robots\.txt|index\.php.*) ) {
rewrite ^/(.*)$ /index.php/$1 last;
}
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include /usr/local/nginx/conf/fastcgi_params;
}
location ~ /index.php/
{
include /usr/local/nginx/conf/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/yourhost.com/htdocs/index.php;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param HTTP_REFERER $http_referer;
fastcgi_pass 127.0.0.1:9000;
}
}
Ну и в конфиге самого CodeIgniter’a нужно указать что $config['uri_protocol'] = "REQUEST_URI";
![["***"] ["***"]](http://farm5.staticflickr.com/4004/4440914452_f73b768952_s.jpg)
![["***"] ["***"]](http://farm3.staticflickr.com/2691/4440914532_a959558afb_s.jpg)
![["Lady with some baggage"] ["Lady with some baggage"]](http://farm5.staticflickr.com/4072/4597949227_2c4b28ed52_s.jpg)
![["Shadows on the bridge"] ["Shadows on the bridge"]](http://farm5.staticflickr.com/4056/4440915350_22ea792823_s.jpg)