我有两个用于网站的服务器。一台服务器将具有 php 代码和数据库,而另一台速度较慢的服务器仅用于存储文件。我需要以通过网站上传的文件必须存储在另一台服务器上的方式来实现这些,然后也可以从那里下载。
谁能建议我实现这一目标的最佳方法。我知道文件可以在通过网站上传后通过 php 的 FTP 功能传输到另一台服务器,但似乎不是正确的方法。
或者两个服务器可以用于静态媒体内容,如图像。
谢谢
我有两个用于网站的服务器。一台服务器将具有 php 代码和数据库,而另一台速度较慢的服务器仅用于存储文件。我需要以通过网站上传的文件必须存储在另一台服务器上的方式来实现这些,然后也可以从那里下载。
谁能建议我实现这一目标的最佳方法。我知道文件可以在通过网站上传后通过 php 的 FTP 功能传输到另一台服务器,但似乎不是正确的方法。
或者两个服务器可以用于静态媒体内容,如图像。
谢谢
最好的办法是只拥有所有文件,包括“存储服务器”上的网站文件。基本上你要做的是挂载“共享文件夹”,这意味着你需要的网站文件和其他文件。(大多数时候,您在存储服务器上只有一个 /var/www-local/ 文件夹,您将其挂载在网络服务器上的 /var/www/ 中)。
通过将它添加到网络服务器上的 /etc/fstab 文件中,确保使用 NFS 安装它。(有关 NFS 的更多信息)
这个想法的好处是,当你想要扩展时,这很容易通过放置一个软件负载均衡器(如 HAProxy),添加尽可能多的网络服务器,你将让你的数据同步。
可能您可以将上传目录挂载到您的网络服务器。检查Linux NFS
通过使用url 包装器,如果您的 ftp 服务器接受此连接类型,您可以使用默认的move_uploaded_file() 。或者,您可以使用 PHP 的ftp 函数,尤其是ftp_put(),将文件上传到服务器。
对于内容交付,您需要有数据库或其他方式来获取内容分发服务器上的原始 url,并将该 url 放入 html 参数中:
<img src="http://cdn1.example.com/images/68263483.png" />
<a href="http://cdn2.example.com/files/9872345.pdf">Download PDF</a>
处理上传文件的示例代码是
<?php
// ...
$uploads_dir = 'images';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name,
"ftp://user:pass@cdn1.example.com/$uploads_dir/$name");
// save url in your database for later retrieval ...
}
}
或使用ftp_put():
<?php
// ...
$ftpCon = ftp_connect('cdn1.example.com')
or die('Could not connect to ftp server');
$uploads_dir = 'images';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
ftp_put($ftpCon, "$uploads_dir/$name", $tmp_name)
or die("could not upload $name to ftp server");
// save url in your database for later retrieval ...
}
}
如果您的应用程序需要对文件服务器进行大量读/写,那么我认为将它分开是个坏主意。也许您可以将 NFS 镜像到您的主 Web 服务器以减少延迟!
使用 nginx 处理对静态文件的所有请求(例如:css、图像、javascript)
在文件服务器上创建一个共享到您要下载和上传文件的目录。如果您打算将 tyem 保存在单独的文件夹中,则共享两个。
使用 PHP 代码库映射 Web 服务器上的文件夹。确保您使用登录名连接到具有读写访问权限的共享。
映射共享后,在网站上创建一个虚拟目录到共享文件夹(这完全取决于您的 Web 服务器)。
检查 PHP 如何处理访问网站共享驱动器上的文件,具体取决于您的网络服务器,它可能与您通常处理文件的方式不同。
我喜欢这种方法,因为服务器操作系统处理与文件服务器之间的文件传输。PHP 只是处理告诉它它需要哪些文件。