适用于Postgres的图像/媒体服务器

时间:2013-12-07 15:08:28

标签: php postgresql image-processing nginx media

我最近有一个nginx + php-fpm服务器正在提供这样的图像:

header('Content-Type: image/png');
echo file_get_contents('example_image.png');
exit();

我开始意识到,无论图像是否被缓存,服务器上都会出现巨大的影响。 CPU利用率非常高,100%,连接数量最少。所以我开始将图像卸载到CDN并立即提升性能,但在某些情况下我仍然需要通过服务器提供图像,这让我想到了图像/媒体服务器。

我的问题是,我应该使用哪种特定类型的服务器?一个可以与数据库通信以查找图像位置并提供服务的人?文件系统类型?或者我最好还是继续启动另一个nginx + php-fpm实例并创建一个类似cdn的结构实现,其中:

media.example.com 

仅指向该服务器,因此对Web服务器没有性能影响?

2 个答案:

答案 0 :(得分:4)

您的问题是您将图像视为字符串而不是流。绝对没有必要使用file_get_contents()在php中加载它并继续进行echo混乱。查找诸如readfile()和PG相关的LOB功能之类的内容:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;

http://php.net/manual/en/function.readfile.php

$db = new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare("select oid from BLOBS where ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid', $oid, PDO::PARAM_STR);
$stmt->fetch(PDO::FETCH_BOUND);
$stream = $db->pgsqlLOBOpen($oid, 'r');
header("Content-type: application/octet-stream");
fpassthru($stream);

http://php.net/manual/en/pdo.pgsqllobopen.php

沿着类似的方向,查看与缓存控制相关的标头。无需重新发送已存在于浏览器缓存中的图像。尝试尽可能发送304 Not Modified:

Make PHP page return "304 Not Modified" if it hasn't been modified

答案 1 :(得分:-1)

你在为图像服务的是什么?因为我会说如果你只是在PHP中提供图像,请使用带有HTML的简单回显?

echo "<img src='image.png'>";

或者如果你想让它显示一个变量,或者其他什么,只需在IMG SRC之后的''里面添加“”(如此)

echo "<img src='" . $this . "." . $extention . "'>";

显示图像不应该对您的服务器造成太大影响吗?但是,嘿,我不是专家。