2015-01-07 3 views
2

Поэтому я использую phpseclib, который загружает 50 МБ-файл через sftp примерно через 45 секунд. Который быстрый по сравнению с ssh2_scp_recv(), который занимает 90 + секунд, но медленный по сравнению с моим sftp-клиентом (filezilla), который занимает 10 секунд макс.Способы ускорения работы phpcllib sftp получить для скачивания удаленный файл

Мой вопрос: что я могу сделать, чтобы ускорить загрузку файлов через sftp, кроме включения расширений mcrypt, gmp и bcmath, которые я уже сделал?

Я запускаю PHP 5.5 в Windows 7 и получаю те же результаты при использовании либо cli, либо browser/apache, и используя sftp-> get для загрузки файла в целом или загрузки файла в куски различных размеры.

Источник:

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); 
require 'phpseclib/Net/SFTP.php'; 

$sftp = new Net_SFTP($host, $port, $timeout); 
$sftp->login($user, $password); 

$sftp->get($remoteFile, $localFile); 
+1

При сравнении phpseclib с filezilla вы принимаете во внимание время, необходимое файлу для подключения и выполнения каталогов? Единственный способ ускорить это, о котором я знаю, - это иметь постоянную связь, которая не является отличной идеей по очевидным причинам. – Scopey

+0

Я не ожидаю, что phpseclib будет таким же быстрым или быстрым, чем выделенный клиент, но имейте в виду, что я сравнивал только время, необходимое для фактической загрузки файла, а не настройки соединения и входа в систему (что принимает менее секунды). phpseclib работает как шарм, и я просто ищу способы улучшить скорость его загрузки :) –

+0

У вас установлен mcrypt? Даже чистые PHP-версии phpeclib для RC4/AES/и т. Д. Являются одними из самых быстрых реализаций pure-PHP вокруг него, не содержат факел для mcrypt, который скомпилирован C. – neubert

ответ

2

С протоколом SFTP клиент (клиентская библиотека) использует «READ» запрос повторно, чтобы получить куски содержимого файла.

Непростая реализация, которую использует phpseclib, отправляет один запрос «READ» (до 32 кБ), ждет ответа «DATA», отправляет другой запрос «READ», ждет и так далее, пока он не получит целый файл.

Если обратная связь с сервером длительная (большая латентность), клиент (библиотека) может быть бесполезно ожидающим большую часть времени.

Смарт-клиенты (библиотеки) преодолевают это, отправляя несколько запросов «READ», не дожидаясь ответа или используя большой запрос «READ», или и то, и другое.

FileZilla, например, отправляет последовательность запросов «READ» размером 32 КБ на общую сумму 1 МБ.

Этот phpeclib не поддерживает эту оптимизацию (обратите внимание, что это действительно для загрузок).

Все, что вы можете сделать, это увеличить размер запроса «ПРОЧИТАТЬ», используя Net_SFTP::max_sftp_packet.

+1

Это имеет смысл и объясняет, почему увеличенные размеры блоков не " t чистый желаемый результат. Я скорректировал значение max_sftp_packet только для целей тестирования и смог сократить время, необходимое для загрузки того же файла на 20 секунд, что в два раза быстрее. –

+0

phpseclib делает то, что вы называете «умным» подходом для загрузки - просто не для загрузки. См. Например, https://github.com/phpseclib/phpseclib/blob/0efae5a91e90e6027b95874e5242f5ea8eaa5754/phpseclib/Net/SFTP.php#L1891. Кроме того, проверьте журналы, если вам нужно еще больше убедить. Возможно, создайте проблему для github для phpseclib с просьбой об этой функции. – neubert

+0

@neubert Спасибо за информацию. Я включил эту информацию в свой ответ. –

Смежные вопросы