cr0t
(Kuznecov Sg)
March 23, 2009, 9:56am
1
Коллеги, бьюсь с такой проблемой:
нужно хранить документы в БД (PostgreSQL);
есть две возможности - в поле типа Bytea и с помощью OID;
в Bytea всё получилось хранить и вынимать (правда не с использованием стандартных pg_escape_bytea и pg_unescape_bytea, т.к. они несимметричны, как выяснилось, а с помощью base64_encode() и base64_decode, соответственно);
не устраивает скорость работы с bytea, тем более под нагрузкой сервер просто умрет, кончится оперативка;
нашел информацию по OID - как сравнение производительности указывает на этот вариант - раз в 5 быстрее загрузка и чтение из БД, и памяти чуть ли не в 10 раз меньше потребляется, НО… вот здесь-то и проблема…
Как правильно организовать работу с OID. У меня сейчас примерно такой код, который основан на найденном мной в Инете и по-быстрому заточенном под Yii:
$document->filename = $uploadedFile->getName();
$document->filetype = $uploadedFile->getType();
$document->filesize = $uploadedFile->getSize();
if($document->save())
{
$connection = Yii::app()->db;
try
{
$fileContent = file_get_contents($uploadedFile->getTempName());
$transaction=$connection->beginTransaction();
$oid = pg_lo_create($connection->pdo);
$connection->createCommand("UPDATE documents SET content_oid = '$oid' WHERE id = $document->id")->execute();
$oidHandle = pg_lo_open($connection->pdo, $oid, 'w');
pg_lo_write($oidHandle, $fileContent);
pg_lo_close($oidHandle);
$transaction->commit();
}
catch(Exception $e)
{
$transaction->rollBack();
}
$this->redirect(CController::createUrl('client/show', array('id'=>$_GET['client_id'])));
}
Эксепшнов не происходит, но в базе поле content_oid - NULL, читать оттуда соответственно тоже не получается. Может у меня проблемы в коде? В исходном примере использовались pg_connect, pg_query и т.д. Я постарался использовать только pg_lo_open и т.п.
digisas
(Tomas)
February 19, 2012, 10:24pm
2
А можно бы было узнать как все работало с Bytea ?
У меня пока что неполучается…
Коллеги, бьюсь с такой проблемой:
нужно хранить документы в БД (PostgreSQL);
есть две возможности - в поле типа Bytea и с помощью OID;
в Bytea всё получилось хранить и вынимать (правда не с использованием стандартных pg_escape_bytea и pg_unescape_bytea, т.к. они несимметричны, как выяснилось, а с помощью base64_encode() и base64_decode, соответственно);
не устраивает скорость работы с bytea, тем более под нагрузкой сервер просто умрет, кончится оперативка;
нашел информацию по OID - как сравнение производительности указывает на этот вариант - раз в 5 быстрее загрузка и чтение из БД, и памяти чуть ли не в 10 раз меньше потребляется, НО… вот здесь-то и проблема…
Как правильно организовать работу с OID. У меня сейчас примерно такой код, который основан на найденном мной в Инете и по-быстрому заточенном под Yii:
<pre class=‘prettyprint’>
$document->filename = $uploadedFile->getName();
$document->filetype = $uploadedFile->getType();
$document->filesize = $uploadedFile->getSize();
if($document->save())
{
$connection = Yii::app()->db;
try
{
$fileContent = file_get_contents($uploadedFile->getTempName());
$transaction=$connection->beginTransaction();
$oid = pg_lo_create($connection->pdo);
$connection->createCommand("UPDATE documents SET content_oid = '$oid' WHERE id = $document->id")->execute();
$oidHandle = pg_lo_open($connection->pdo, $oid, 'w');
pg_lo_write($oidHandle, $fileContent);
pg_lo_close($oidHandle);
$transaction->commit();
}
catch(Exception $e)
{
$transaction->rollBack();
}
$this->redirect(CController::createUrl('client/show', array('id'=>$_GET['client_id'])));
}
</pre>
Эксепшнов не происходит, но в базе поле content_oid - NULL, читать оттуда соответственно тоже не получается. Может у меня проблемы в коде? В исходном примере использовались pg_connect, pg_query и т.д. Я постарался использовать только pg_lo_open и т.п.