1

我的 Web 服务器在一台服务器上运行,而数据获取在另一台服务器上运行。我的代码将尝试复制一个远程文件并将其存储在我的本地路径中。例如,远程位置是 /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;
   }
}

非常感谢你!

4

3 回答 3

1

如果您使用 HTTP 并且启用了 PHP 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

编辑:

要将文件内容保存到本地文件,请使用 file_get_contents() 的对应项:file_put_contents()。例子:

file_put_contents('path/to/the/local-file', $content);
于 2011-06-30T19:37:54.190 回答
1

如果您使用的是 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 和流语法,或者你可以做一些类似于我上面做的事情:

 $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 建立隧道),但它仍然是一个非常令人印象深刻的库。查看手册的网络部分,(如果我记得的话)它将为您提供足够多的资源来满足您的要求。

于 2011-06-30T19:41:16.857 回答
0

我不太确定我是否理解您的问题,但如果您的远程位置是

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

那么这正是你的道路。如果您喜欢通过 HTTP 获取源代码,则必须以 http:// 开头。如果您希望通过 FTP 获取它,请使用 ftp://。这将指示 copy() 函数启动适当的协议

编辑:关于 filectime() 这是一个文件系统函数,不适用于 HTTP 或 FTP。如果您是源文件的作者,您可以在标题中设置一些日期时间信息。

于 2011-06-30T19:47:59.867 回答