stream_context_set_params не работает с оболочкой ssh2.sftp

Я хочу использовать такие функции, как здесь. Пожалуйста, проверьте код ниже

function notify (
    $notification_code,
    $severity,
    $message,
    $message_code,
    $bytes_transferred,
    $bytes_max
) {
    echo "Runned \n";
};

$ctx = stream_context_create();
stream_set_params($ctx, array('notification' => 'notify'));
$ssh_connection = ssh2_connect('myhost');
ssh2_auth_password($ssh_connection, 'login','pass');
$sftp_resource = ssh2_sftp($ssh_connection);
$data = file_get_contents("ssh2.sftp://{$sftp_resource}/path/to/big/file",
            false, $ctx);

Я ожидаю, что моя функция уведомления будет вызвана хотя бы один раз. На самом деле тот же код работает и для ftp-оберток.

function notify (
    $notification_code,
    $severity,
    $message,
    $message_code, 
    $bytes_transferred,
    $bytes_max
) {
    echo "Runned \n";
};

$ctx = stream_context_create();
stream_set_params($ctx, array('notification' => 'notify'));
$scheme = 'ftp';
$data = file_get_contents("{scheme}://username:password@host:port/path/to/file",
            false, $ctx);

И это работает нормально! Функция уведомления вызывается много раз. Я пытаюсь использовать sftp-оболочку, как это

$data = file_get_contents("ssh2.sftp://username:password@host:port/path/to/big/file",
            false, $ctx);

И это тоже не работает. Есть идеи?


person Stanislav    schedule 12.02.2013    source источник
comment
Я не уверен, но я думаю, что это одна из концепций ssh. Обработка зашифрованного соединения выполняется ssh lib, а не php. Поэтому никаких уведомлений. Проверим, верно ли сказанное   -  person hek2mgl    schedule 12.02.2013
comment
Ага. Кажется, это не должно работать для оболочек ssh и ssh (scp, туннель, sftp и т. д.)   -  person Stanislav    schedule 12.02.2013
comment
да. Я тоже тестировал. Кстати, я нашел segfault в расширении php-ssh2. :| ... Я сейчас смотрю в коде расширения, чтобы узнать, почему уведомление не вызывается. Либо так задумано, либо просто не реализовано   -  person hek2mgl    schedule 12.02.2013


Ответы (2)


Расширение ssh2 не поддерживает обратные вызовы уведомлений. Я не знаю, задумано ли это или просто не реализовано, но в коде расширений отсутствуют вызовы таких функций, как:

Из (PHP-5.4.10) /ext/standard/ftp_fopen_wrapper.c, строка 573:

php_stream_notify_progress_init(context, 0, file_size);

Обходной путь, который я еще не тестировал, может заключаться в использовании ftps:// (FTP через ssl). Он должен соответствовать вашим требованиям безопасности и, как выглядит код, будет поддерживать уведомления как ftp. В частности, он использует тот же urlwrapper, что и ftp.

person hek2mgl    schedule 12.02.2013

Похоже, что недавняя фиксация в оболочке чистого PHP SFTP-потока phpseclib добавляет поддержку уведомлений:

https://github.com/phpseclib/phpseclib/commit/a47c1c39809a18b870b3812ce9ab84c7bd55efdd

person neubert    schedule 16.04.2013