Я хочу получить файл через SFTP с сервера, чтобы мой веб-сервер разрешил пользователям загружать его позже. Для этого я использую библиотеку phpseclib . К сожалению, это очень медленно, поскольку я могу достичь скорости 300-350 кбит / с, когда я смог достичь более 1 Мб / с, прежде чем при прямой загрузке с сервера, на котором размещены исходные файлы. По некоторым внутренним причинам в нашей компании мы должны перенести эти файлы на другой сервер, на котором открыт только порт 22, поэтому, когда пользователь переходит по следующей ссылке: http://my.website.com/some/path/getfile/getfile.php?filename=someFileName.extension
my php script подключается через SSH к серверу, на котором размещаются файлы, а затем загружает указанный файл в поток php://output
чтобы пользователь мог его загрузить.
Вот мой php-скрипт:
error_reporting(E_ERROR); include('Net/SFTP.php'); include('Crypt/RSA.php'); if (!isset($_GET['filename'])) die(); # This if statement is there as a layer of protection to prevent users from going elsewhere # in the filesystem of the server. if (!strpos($_GET['filename'], '..') and !strpos($_GET['filename'], '/') and !strpos($_GET['filename'], '\\')) { $sftp = new Net_SFTP('my.website.com'); $key = new Crypt_RSA(); $key->loadkey(file_get_contents('key.pvt')); if (!$sftp->login('loginUserName', $key)) { exit('Login Failed'); } header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$_GET['filename']); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate'); header('Accept-Ranges: bytes'); header('Expires: 0'); header('Pragma: public'); header('Content-Length: ' . $sftp->size('transfer/'.$_GET['filename'])); ob_clean(); flush(); set_time_limit(3600); $sftp->get('transfer/'.$_GET['filename'], 'php://output'); }
вerror_reporting(E_ERROR); include('Net/SFTP.php'); include('Crypt/RSA.php'); if (!isset($_GET['filename'])) die(); # This if statement is there as a layer of protection to prevent users from going elsewhere # in the filesystem of the server. if (!strpos($_GET['filename'], '..') and !strpos($_GET['filename'], '/') and !strpos($_GET['filename'], '\\')) { $sftp = new Net_SFTP('my.website.com'); $key = new Crypt_RSA(); $key->loadkey(file_get_contents('key.pvt')); if (!$sftp->login('loginUserName', $key)) { exit('Login Failed'); } header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$_GET['filename']); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate'); header('Accept-Ranges: bytes'); header('Expires: 0'); header('Pragma: public'); header('Content-Length: ' . $sftp->size('transfer/'.$_GET['filename'])); ob_clean(); flush(); set_time_limit(3600); $sftp->get('transfer/'.$_GET['filename'], 'php://output'); }
вerror_reporting(E_ERROR); include('Net/SFTP.php'); include('Crypt/RSA.php'); if (!isset($_GET['filename'])) die(); # This if statement is there as a layer of protection to prevent users from going elsewhere # in the filesystem of the server. if (!strpos($_GET['filename'], '..') and !strpos($_GET['filename'], '/') and !strpos($_GET['filename'], '\\')) { $sftp = new Net_SFTP('my.website.com'); $key = new Crypt_RSA(); $key->loadkey(file_get_contents('key.pvt')); if (!$sftp->login('loginUserName', $key)) { exit('Login Failed'); } header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$_GET['filename']); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate'); header('Accept-Ranges: bytes'); header('Expires: 0'); header('Pragma: public'); header('Content-Length: ' . $sftp->size('transfer/'.$_GET['filename'])); ob_clean(); flush(); set_time_limit(3600); $sftp->get('transfer/'.$_GET['filename'], 'php://output'); }
Это работает, хотя, как уже упоминалось, это очень медленно. Что может быть причиной этого замедления?