Путь к сетевому файлу - PullRequest
1 голос
/ 30 июня 2011

Мой веб-сервер работает на одном сервере, а выборка данных выполняется на другом сервере. Мой код попытается скопировать удаленный файл и сохранить его по моему локальному пути. Удаленное местоположение, например, /home/testUser/remoteData.xml. Я знаю IP-адрес сервера и имя хоста. Как я могу построить путь для заполнения remotePath?

#remotePath is the path to the file on the network
public function __construct()
{
   $this->localPath="currentData.xml";
   $this->remotePath="a remote path";
}

#this will attempt to make a copy from that network file and store it locally
private function fetchServer()
{
   if (!(file_exists($this->remotePath)) || (time() - filectime($this->remotePath)) >= 1200)
      return false;
   else
   {  $success = copy($this->remotePath, $this->localPath);
      if($success)
         return true;
      else
         return false;
   }
}

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 30 июня 2011

Если вы используете HTTP, вы не сможете проверить время создания.Если вы знаете, что это небольшой управляемый файл, вы можете использовать file_get_contents:

 $fl = @file_get_contents( '<stream>' );
 if( !$fl ) return false; // file does not exist remotely
 $ret = @file_put_contents( '<output name>', $fl );// just output it
 return $ret && true; //force it to boolean

Если он немного больше, вы можете использовать синтаксис cURL и stream, или вы можете сделать что-то похожее наЯ сделал выше:

 $fl = @fopen( '<stream>' );
 if( !$fl ) return false;// file does not exist remotely
 $out = @fopen( '<local file>', 'w');
 if( !$out ) return false;
 while($data = fread($fl)){fwrite($out,$data);}
 fclose($out);
 return true;

Конечно, во всех ситуациях вам нужно будет загрузить файл в локальную версию, а затем выполнить некоторую форму контрольной суммы, чтобы увидеть, есть ли разница.

РЕДАКТИРОВАТЬ


Вы только что упомянули, что отметка времени является обязательным требованием, но у вас также есть SSH.Если у вас есть SSH, то вы можете использовать SFTP (что-то, что поддерживает SSH).Я использовал phpseclib для нескольких проектов и, хотя он и не идеален (он есть в PHP4 и он по-настоящему не туннелирует для SSH), тем не менее, это очень впечатляющая библиотека.Посмотрите на network часть руководства, и (если я помню) этого вам будет более чем достаточно, чтобы выполнить то, что вы просите.

1 голос
/ 30 июня 2011

Если вы используете HTTP и включена директива allow_url_fopen, вы можете напрямую использовать URL для своего файла. Пример:

$content = file_get_contents('http://www.yourdomain.dom/virtual/path/to-your-file');

/virtual/path/to-your-file - относительный путь к корню вашего документа.

Если у вас ограниченная среда PHP, которая не позволяет открывать удаленные файлы, вы можете использовать потоки PHP cURL или PHP .

EDIT:

Чтобы сохранить содержимое файла в локальном файле, используйте аналог file_get_contents (): file_put_contents () . Пример:

file_put_contents('path/to/the/local-file', $content);
0 голосов
/ 30 июня 2011

Я не совсем уверен, что понимаю ваш вопрос, но если ваше удаленное местоположение -

http://www.somehost.com/home/testUser/remoteData.xml

, то это именно ваш путь.Вы должны начать с http: //, если хотите получить исходный код через HTTP.Используйте ftp: //, если хотите получить его по FTP.Это даст команду функции copy () инициировать соответствующий протокол

Редактировать: О filectime () это функция файловой системы, которая не будет работать для HTTP или FTP.Если вы являетесь автором исходного файла, вы можете установить некоторую информацию о дате и времени в заголовок.

...