In addition to my previous post, I figured out that sftp->fopen->file_get_contents->fwrite has much better performance than ssh2_scp_send.
I've used the following code to test:
<?php
$srcFile = '/var/tmp/dir1/file_to_send.txt';
$dstFile = '/var/tmp/dir2/file_received.txt';
// Create connection the the remote host
$conn = ssh2_connect('my.server.com', 22);
// Create SFTP session
$sftp = ssh2_sftp($conn);
$sftpStream = @fopen('ssh2.sftp://'.$sftp.$dstFile, 'w');
try {
if (!$sftpStream) {
throw new Exception("Could not open remote file: $dstFile");
}
$data_to_send = @file_get_contents($srcFile);
if ($data_to_send === false) {
throw new Exception("Could not open local file: $srcFile.");
}
if (@fwrite($sftpStream, $data_to_send) === false) {
throw new Exception("Could not send data from file: $srcFile.");
}
fclose($sftpStream);
} catch (Exception $e) {
error_log('Exception: ' . $e->getMessage());
fclose($sftpStream);
}
?>
For the test I've sent three files with total size of 6kB, and the times to send including connect to the server were:
SFTP -> 15 sec.
ssh2_scp_send -> 22 sec.
Cheers,
Pimmy
PHP.mk документација
ssh2_scp_send
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
function.ssh2-scp-send.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + превод во позадина
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
function.ssh2-scp-send.php
ssh2_scp_send
Референца за `function.ssh2-scp-send.php` со подобрена типографија и навигација.
ssh2_scp_send
(PECL ssh2 >= 0.9.0)
ssh2_scp_send — Send a file via SCP
= NULL
ssh2_scp_send(
resource
string
string
int
): bool
resource
$session,string
$local_file,string
$remote_file,int
$create_mode = 0644): bool
Испрати датотека преку SCP
Параметри
session- Барај SFTP подсистем од веќе поврзан SSH2 сервер. ssh2_connect().
local_file- Копирај датотека од локалниот систем до оддалечениот сервер користејќи го SCP протоколот.
remote_file- Пат до локалната датотека.
create_mode-
Пат до оддалечената датотека.
create_mode.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true на успех или false при неуспех.
Примери
Датотеката ќе биде креирана со режимот специфициран од
<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>Види Исто така
- ssh2_scp_recv() Пример #1 Отворање датотека преку SFTP
- copy() Пример #1 Пример со
Белешки од корисници 4 белешки
- Преземи проширен поток со податоци ¶
пред 17 години
- Преземи проширен поток со податоци ¶
пред 17 години
After some testing I figured out that ssh2_scp_send does not work exactly as the standard scp command:
- Works: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/file_02.txt');
- Wrong: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp'); (Creates file with name 'tmp')
- Fails: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/');
- Fails: ssh2_scp_send($conn, '/dirname', /var/tmp/'); (No recursion)
- Fails: ssh2_scp_send($conn, '/dirname/*', /var/tmp/'); (Cannot copy more than one file.)
Cheers,
Pimmy
Пример #1 Качување датотека преку SCP ¶
пред 15 години
On Windows, I had trouble using ssh2_scp_send: files copied to a remote server where incomplete (truncated) and/or locked (error message : "access denied"). The back-end is also on Windows, using CopSSH (cygwin-based SSH server).
The SSH session was kept open - and the file were never flushed to disk.
There's a workaround though - make an explicit call to "exit" to close the session (flushing file content to disk):
<?php
$objConnection = ssh2_connect($strHost, $strPort, $methods, $callbacks);
ssh2_auth_password($objConnection, $strUser, $strPassword);
ssh2_scp_send($objConnection , $strSource, $strDest);
// Add this to flush buffers/close session
ssh2_exec($objConnection, 'exit');
?>
emmanuel dot kartmann at prosdk dot com ¶
пред 9 години
In case the command:
$sftpStream = @fopen('ssh2.sftp://'.$sftp.$dstFile, 'w');
causes you a segmentation fault, try using:
$sftpStream = @fopen('ssh2.sftp://'.intval($sftp).$dstFile, 'w');
Credit: http://stackoverflow.com/questions/7414175/php-sftp-seg-fault