gpt4 book ai didi

PHP:读取远程文件(最好使用 fopen)

转载 作者:行者123 更新时间:2023-12-02 03:33:15 30 4
gpt4 key购买 nike

我想使用 PHP 读取远程文本文件(最好使用 fopen)。当我在本地文件上使用此函数时,我的脚本使用 fopen 工作。

我已经尝试过:

$file = fopen ("http://abc.abc.abc", "r");
if (!$file) {
echo "<p>Unable to open remote file.\n";
exit;
}

我得到了:

Warning: fopen(http://abc.abc.abc): failed to open stream: No connection could be made because the target machine actively refused it. in C:\xampp\htdocs\NMR\nmrTest5.php on line 2 Unable to open remote file.

我读过phpseclib可能是一个不错的选择,因为我可以使用 WinSCP (SFTP) 或使用 Puttyfor 访问我的文件,我尝试了这个(将所有文件从 phpseclib 复制到我的目录后)希望我可以在本地复制该文件,然后使用fopen(对于 met 来说不是最好的事情,但我可以忍受):

include('Net/SFTP.php');

$sftp = new Net_SFTP('abc.abc.abc');
if (!$sftp->login('username', 'pass')) {
exit('Login Failed');
}

我得到了:

Notice: No compatible server to client encryption algorithms found in C:\xampp\htdocs\NMR\Net\SSH2.php on line 1561Login Failed

有趣的是,如果我连接到服务器(使用 WinSCP),我会收到不同的消息:

Notice: Error reading from socket in C:\xampp\htdocs\NMR\Net\SSH2.php on line 3362

Notice: Connection closed by server in C:\xampp\htdocs\NMR\Net\SSH2.php on line 1471Login Failed

知道如何让它发挥作用吗?理想情况下,我会使用 fopen,但我愿意接受其他解决方案。

最佳答案

我自己刚刚解决了这个问题,但在任何一个地方都找不到任何好的文档来说明如何实现这一目标。

我刚刚创建了一个使用 Monolog 的日志记录服务,并且基本上根据正在写入/创建的日志文件创建了一个自定义流处理程序。因此,它需要一种资源(例如由 fopen 创建的资源)才能将日志文件写入 SFTP 服务器。

我使用 ssh2 库让它工作,如下所示:

$connection = ssh2_connect($this->host, 22);
ssh2_auth_password($connection, $this->user, $this->password);

$sftp = ssh2_sftp($connection);

//some stuff to do with whether the file already exists or not

$fh=fopen("ssh2.sftp://$sftp".ssh2_sftp_realpath($sftp,".")."/$this->logName/$this->fileName", 'a+');

return new StreamHandler($fh);

一切都工作得很好,直到我将该服务集成到另一个项目中,并意识到这仅适用于我的开发计算机,因为它安装了 libssh2as outlined in this question

不幸的是,向生产服务器添加库并不那么容易。因此,我发现自己正在寻找不同的解决方案。

我在其他项目中使用了 phpseclib,但仅用于基本的 get()put() 和一些 nlist() 调用。

为了使其正常工作,我必须使用 Stream 对象。没有很好的记录,但有 a good discussion here .

根据那里的信息,加上对 SFTP 类的一些挖掘,特别是 get() 函数,这就是我如何设法使用phpseclib

SFTP\Stream::register();
$sftpFileSystem = new SFTP($this->host);
if (!$sftpFileSystem->login($this->user, $this->password)) {
throw new Exception("Error logging in to central logging system. Please check the local logs and email for details", 1);
}

$context = [
'sftp' => [
'sftp' => $sftpFileSystem
],
];

//some stuff to do with whether the file already exists or not
$remote_file = $sftpFileSystem->realpath('test.txt');

$sftpStream = fopen("sftp://.{$remote_file}", 'a+', null, stream_context_create($context));
if (!$sftpStream) {
exit(1);
}

return new StreamHandler($sftpStream);

请注意调用 fopen()sftp:// 后面的点 (.)。浪费了我好半个小时!

关于PHP:读取远程文件(最好使用 fopen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51583180/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com