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
ssh2_scp_send
(PECL ssh2 >= 0.9.0)
ssh2_scp_send — Envoie un fichier via SCP
Description
bool ssh2_scp_send
( resource $session
, string $local_file
, string $remote_file
[, int $create_mode= 0644
] )
Copie un fichier depuis le système de fichiers local vers un serveur distant.
Liste de paramètres
- session
-
Un identifiant de connexion SSH, obtenu depuis la fonction ssh2_connect().
- local_file
-
Chemin vers le fichier local.
- remote_file
-
Chemin vers le fichier distant.
- create_mode
-
Le fichier sera créé avec le mode spécifié par create_mode .
Valeurs de retour
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemples
Exemple #1 Chargement d'un fichier via SCP
<?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_send
stefanov at uk dot ibm dot com
02-May-2008 09:07
02-May-2008 09:07
stefanov at uk dot ibm dot com
25-Apr-2008 09:23
25-Apr-2008 09:23
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
