2

我想使用这里的功能。请检查下面的代码

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);

我希望我的 notify 函数至少会被调用一次。实际上,相同的代码适用于 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);

而且它也不起作用。有任何想法吗?

4

2 回答 2

2

ssh2 扩展不支持通知回调。我不知道这是设计使然还是没有实现,但扩展代码缺少对以下函数的调用:

来自 (PHP-5.4.10) /ext/standard/ftp_fopen_wrapper.c,第 573 行:

php_stream_notify_progress_init(context, 0, file_size);

一种我尚未测试过的解决方法ftps://可能是使用(FTP over ssl)。它应该满足您的安全需求,并且 - 正如代码所示 - 将支持作为 ftp 的通知。详细地说,它使用与 ftp 相同的 urlwrapper。

于 2013-02-12T13:12:45.407 回答
1

看起来最近对phpseclib 的纯 PHP SFTP 流包装器的提交增加了对通知的支持:

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

于 2013-04-16T18:47:55.460 回答