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, которая по сути является “внутренней ошибкой без описания”. Вобщем вилы, куда копать непонятно, но врагу не сдается наш гордый варяг ))
Если кто-то в курсе, или работал в такой связке - помогите пожалуйста )))

Published on Tue, 21 Apr 2009 04:54

Сюрпризы PDO

Работая с PDO обнаружил такую фишку - все объекты *LOB в оракле он не выбирает при fetch, а вместо этого выдает ссылку на объект типа (stream). Это PHP stream, чтобы его получить нужно выполнить stream_get_contents(). Понятно зачем это сделано, все к оптимизации и удобству, но я бы опционально разрешил вернуть все назад, и выбирать LOB’ы сразу в значения, как это делал например PEAR:DB.

В итоге чтобы выбрать текст новости из поля типа CLOB в Oracle мне пришлось делать так:

function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date from news where id=:id");
$newsq->execute(array(":id" => $id));
$newsq->bindColumn(3, $news_body, PDO::PARAM_LOB);
$data = ($newsq->fetch(PDO::FETCH_OBJ));
$data->NEWS_BODY = stream_get_contents($news_body);
return $data;
}
Немного не удобно, но привыкнуть можно.

Кроме того, бился сегодня головой об стену, по поводу того что выбирая фреймворк не наткнулся на Kohana. Она еще конечно сильно бета, но этот фреймворк по заявкам разработчиков - именно то что мне нужно. Там и PDO, там и memcached…
Эх, вот всегда так…

Published on Sun, 14 Oct 2007 18:39