2011-08-19 12 views
6

Tengo dos servidores para un sitio web. Un servidor tendrá un código php y una base de datos y otro servidor de menor velocidad para almacenar solo archivos. Necesito implementar esto de una manera que el archivo cargado a través del sitio web debe almacenar en otro servidor y luego puede ser descargado desde allí.Servidor de archivos separado para un sitio web php

¿Alguien puede sugerirme la mejor manera de lograr eso. Sé que los archivos pueden transferirse a otro servidor mediante funciones de FTP de php justo después de cargar a través del sitio web, pero no parece una forma correcta.

O dos servidores se pueden usar para contenido multimedia estático como solo imágenes.

Gracias

+0

¿Qué tipo de archivos se almacenan en el servidor secundario? – ExtremeCoder

+0

Necesita mucha más información. ¿Qué tipo de SO son los servidores que se ejecutan? ¿Tiene acceso de administrador a él? –

+0

Gracias por sus comentarios, los archivos serán cargados por el usuario de la aplicación. Puede ser pdf, doc e imágenes. El servidor debe estar basado en Linux. Debo tener acceso de administrador porque sin eso podría no ser posible – phpian

Respuesta

13

La mejor idea es simplemente tener TODOS los archivos, incluidos los archivos de sitios web en el "servidor de almacenamiento". Básicamente lo que haces es montar la "carpeta compartida", esto significa los archivos de sitios web y otros archivos que necesitarás. (La mayoría de las veces solo tiene una carpeta/var/www-local/en el servidor de almacenamiento, que monta en/var/www/en el servidor web).

Asegúrese de montarlo usando NFS agregándolo en el archivo/etc/fstab en el servidor web. (More info on NFS)

La ventaja de esta idea es que cuando se quiere ampliar, esto es fácilmente posible por poner un equilibrador de carga de software (como HAProxy), añadiendo tanto servidores web como desee y que tendrá sus datos en sincronía .

+0

Significa que habrá dos servidores. El segundo servidor se montará en el servidor principal y al hacer esta aplicación no necesita pensar en otro servidor. Se tratará como un sistema sin otras URL para el segundo servidor. – phpian

+0

Esto solo responde a una parte de la pregunta, ya que no podrá usar el espacio externo como una red de distribución de contenido dedicada. – Lars

4

puede ser usted puede montar el directorio de subida a su servidor web. Verificar Linux NFS

3

No sé si esta es la mejor manera, pero ¿por qué no simplemente tener el servidor de archivos como un subdominio separado? De esta forma, puede manejar todos los detalles de descarga de archivos y puede conectarse a él a través de FTP o SFTP desde el servidor principal.

Básicamente, aquí es un proceso que podría utilizar:

  1. punto de su subdominio en el servidor secundario. Encontré información sobre ese here.
  2. Tiene un formulario de carga en su servidor principal que procesa y valida el archivo.
  3. Cuando el archivo se considera aceptable, enviarlo al otro servidor a través de FTP o SFTP. Si no puede obtener las herramientas PHP trabajando para esto, phpseclib podría ayudar. Es posible que desee hacer este paso de subprocesos múltiples.
+0

Tener esto será una sobrecarga en el servidor principal, ya que todos los archivos cargados a través de la aplicación serán FTP a otro servidor. El usuario final también sufrirá un retraso adicional porque el archivo será cargado por él primero va al servidor principal (él hará la entrada de la base de datos) luego será FTP al servidor de archivos. – phpian

0

si su aplicación requiere una lectura/escritura intensiva en el servidor de archivos, entonces creo que es una mala idea separarla. ¡quizás pueda reflejar el NFS en su servidor web principal para reducir la latencia!

uso nginx para manejar todas las solicitudes de archivos estáticos (por ejemplo: css, imágenes, JavaScript)

5

que he usado algo llamado Gluster que permite cosas como esta. La situación en la que lo uso es más para el equilibrio de carga que para la distribución de contenido alternativo.

Además, sitios como Stack Overflow utilizan servicios de Content Distribution Network para cierta información en su sitio. Una solución como esta podría ser más rentable que comprar/configurar/mantener un servidor completamente nuevo.

+0

que parece un proyecto muy interesante, ¡gracias! – Lars

+0

+1 para Gluster, gran solución. – ceejayoz

1

Al usar un url wrapper, puede usar su move_uploaded_file() predeterminado, si su servidor ftp acepta este tipo de conexión. Alternativamente, puede usar PHP's ftp functions, especialmente ftp_put(), para cargar el archivo en el servidor.

Para la entrega de contenido, es necesario tener una base de datos u otros medios para obtener la dirección URL original en el servidor de distribución de contenido y poner la url en los argumentos html:

<img src="http://cdn1.example.com/images/68263483.png" /> 
<a href="http://cdn2.example.com/files/9872345.pdf">Download PDF</a> 

Un código de ejemplo para manejar una subida archivos serían

<?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:[email protected]/$uploads_dir/$name"); 

     // save url in your database for later retrieval ... 
    } 
} 

o con 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 ... 
    } 
} 
0
  1. Cree un recurso compartido en el servidor de archivos para el directorio donde desea descargar y cargar archivos. Dos acciones si planea mantener tyem en carpetas separadas.

  2. Mapa de las carpetas en el servidor web con el código PHP Base. Asegúrese de utilizar un inicio de sesión para conectarse a los recursos compartidos que tendrán acceso de lectura y escritura.

  3. Una vez que haya asignado los recursos compartidos, cree un directorio virtual en el sitio web en la carpeta compartida (todo esto depende de su servidor web).

  4. Compruebe cómo PHP maneja el acceso a archivos en una unidad compartida en un sitio web, dependiendo de su servidor web puede ser diferente de cómo maneja normalmente los archivos.

Me gusta este enfoque porque el SO del servidor se encarga de transferir los archivos hacia y desde el servidor de archivos. PHP solo maneja diciéndole qué archivos necesita.

Cuestiones relacionadas