Search code examples
phpfopenphpseclib

PHP: read a remote file (ideally using fopen)


I'd like to read a remote text file (ideally using fopen) using PHP. My script works using fopen when I'm using this function on a local file.

I've tried:

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

and I got:

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.

I've read that phpseclib could be a good option and since I can access to my files using WinSCP (SFTP) or by using Puttyfor I tried this (after copying all the files from phpseclib to my directory) hoping that I could copy locally the file and then read it with fopen (not the best thing for met but I could live with that):

include('Net/SFTP.php');

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

and I got:

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

Interstingly, I got a different message if I was connected to the server (using 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 1471 Login Failed

Any idea on how I could get it to work? Ideally I would use fopen but I'm open to other solution.


Solution

  • This is how I ended fixing my problem usng phpseclib as suggested by @neubert in the comments of my question.

    I first added the phpseclib folder on my server. Then I used this code in my PHP file to get access to my file on a remote server:

    //needed for phpseclib
    set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
    include_once('Net/SFTP.php');
    
    //connection to the server
    $sftp = new Net_SFTP('abc.abc.abc');
    if (!$sftp->login('my_login', 'my_password')) {
      exit('Login Failed');
    }
    
    //dump entire file in a string, convert to an array and check number of lines
    
    else {
      $text = $sftp->get('full_path_to_my_file');
    }
    $myArray = explode("\n", $text);
    $nbline = count($myArray);