php中本地檔案拷貝至遠端伺服器的實現方式

2021-06-26 10:28:40 字數 2494 閱讀 9741

需要解決的問題:本地檔案搬移至遠端伺服器

前提:在linux伺服器之間拷貝

以下作為備忘和整理記錄下來

因為在linux上拷貝檔案,同事提醒用scp來做,搜尋php scp之後發現php官方提供了使用scp向遠端伺服器拷貝檔案以及相應的ssh連線方法。

使用方法如下:

$ip = ***;

$port = ***;

$user = ***;

$pass = ***;

$material_path = 'material_api.txt';

$target_path = '/data/aa/a';

$connection = ssh2_connect($ip, $port);

ssh2_auth_password($connection, $user, $pass);

$sftp = ssh2_sftp($connection);

$result = ssh2_scp_send($connection, $material_path, $target_path."/".$material_path, 0777);

echo "拷貝檔案結果".$result."\n";

測試以上方法,報錯
call to undefined function ssh2_connect()

檢查需要在伺服器上安裝ssh擴充套件,需要libssh2、ssh2。

安裝擴充套件之後,測試上面**成功。

程式報錯

failed

copying file

多次嘗試都失敗,換為demo中的txt檔案,執行成功。

猜測是檔案型別或檔案大小的原因。

檢視檔案系統,複製的檔案大小小於實際檔案。

檢視官方**的說明,沒有對ssh2_scp_send方法的傳輸檔案的大小的說明。

再查網上只找到乙個類似情況的提問,說遇到大檔案的時候,拷貝檔案失敗。

後來在php官網看到使用者貢獻的使用方法中提到使用fopen、fwrite作為替代,方法如下:

<?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

$data_to_send = @file_get_contents($srcfile);

if ($data_to_send === false)

if (@fwrite($sftpstream, $data_to_send) === false)

fclose($sftpstream);

} catch (exception $e)

?>

後來在程式中打上log,發現拷貝大檔案的時候程式執行到@file_get_contents($srcfile)就不向下執行,但也沒有錯誤資訊。

猜測file_get_contents()方法將檔案內容讀為乙個字串,當檔案大小比較大時,方法處理時會有問題。

$user = ***;

$ip = ***;

$source_path= 'material_api.txt';

$target_path = '/data/aa/a';

$dest = $user."@".$ip.":".$target_path."/".$source_path;

exec("scp ".$source_path." ".$dest , $output, $return);

方法使用spc命令直接向遠端伺服器拷貝檔案。 

測試上述**發現執行時,需要身份驗證。

再通過資料查詢建立了server1和server2之間的信任關係,使server1向server2執行scp不再需要每次都輸入密碼。

再測試以上**,當拷貝成功的時候$return=0;失敗的時候$return=1,完成了本地檔案向遠端伺服器拷貝檔案的要求。

ps:後期查詢資料發現,對於file_get_contents(filename, use_iclude_path,context,offset,maxlen)讀取大檔案時,也許能夠通過引數offset(檔案讀取的起始位置)、maxlen(讀取的最大長度)的設定來分段讀取檔案。

如何在server1和server2之間建立信任關係不在這裡說明,會另外說明。

伺服器遠端拷貝檔案

有多台伺服器a b c,每台伺服器的程式每小時都生成大量的日誌檔案,日誌處理程式部署在伺服器a,伺服器b和c生成的日誌需要拷貝到遠端伺服器a上處理。那麼b和c生成的日誌檔案如何以小時為單位拷貝到遠端伺服器上呢?常用方法有ftp和scp,這裡主要敘述scp secure copy 的使用。scp的命令...

Git轉殖遠端倉庫與本地檔案上傳至新建倉庫

在轉殖之前,git黑視窗 git bash 目錄一定要先進入到想要轉殖的目標空資料夾內。下面以轉殖github中的bob使用者的rep倉庫為例 git clone 在上傳之前,git黑視窗 git bash 目錄一定要先進入到想要上傳的目標資料夾內。建立乙個空的遠端倉庫,如github 將本地目錄初...

本地檔案上傳到遠端伺服器

win7下 用putty好像不太行。用securecrt非常方便。步驟如下 2 輸入rz,點enter 3 會彈出對話方塊,選擇要上傳的檔案 4 上傳,會顯示百分比 速率和時間等資訊。前段時間裝了ubuntu,不再使用win7了.所以想起來要更新下這篇文章.ubuntu下,我喜歡用的工具是termi...