您在使用 ssh2_scp_send 傳輸任何檔案時都會遇到問題,除非您在實際檔案之後傳送一個虛擬檔案,或者最好發出一個
ssh2_exec ($connection, 'exit');
我正在多個伺服器上傳輸數十萬個檔案,並且注意到每個檔案都有不符的 md5 雜湊值和位元組長度。
經過一番研究,我得知這是一個錯誤,並且在 pecl.php.net 的錯誤部分中建議新增了以上程式碼。
希望這能幫助那些遇到檔案傳輸不完整,可能會毀掉您整個應用程式的人。
您在使用 ssh2_scp_send 傳輸任何檔案時都會遇到問題,除非您在實際檔案之後傳送一個虛擬檔案,或者最好發出一個
ssh2_exec ($connection, 'exit');
我正在多個伺服器上傳輸數十萬個檔案,並且注意到每個檔案都有不符的 md5 雜湊值和位元組長度。
經過一番研究,我得知這是一個錯誤,並且在 pecl.php.net 的錯誤部分中建議新增了以上程式碼。
希望這能幫助那些遇到檔案傳輸不完整,可能會毀掉您整個應用程式的人。
在 HPUX 11.11 上安裝的步驟
只需按照手冊頁面上的安裝說明操作,並解決出現的問題即可
- 在建立 libssh2 時
與 /lib/pa20_64 和 32 位元連結中的 64 位元程式庫相關的問題
編輯設定檔並將
SHLIB_LDFLAGS="-b +vnocompatwarnings -L/lib/pa20_64"
變更為
SHLIB_LDFLAGS="-b +vnocompatwarnings -L/lib"
- 在執行 phpize 時
aclocal、autom4ke 和 m4 的問題
安裝 automake、autoconf 和 m4
- 在 ./configuring ssh2 時
Configure: error: libssh2 version >= 0.4 not found
編輯 configure.m4 並從行中刪除 -ldl 切換(如先前所發佈)
39 -L$SSH2_DIR/lib -lm -ldl
再次執行 phpize 並執行 ./configure --with-ssh2
取得奇怪的「無法開啟 ssh2.sftp://Resource id #3/example.txt」錯誤?這是 PHP > 5.6.27 中的錯誤。使用 intval() 作為解決方法,讓 ssh2 再次運作
$sftp = ssh2_sftp($connection);
fopen("ssh2.sftp://" . intval($sftp) . "/example.txt", 'r');
https://bugs.php.net/bug.php?id=73597
我正在 sparc64 上的 OpenBSD 3.9 下建置 ssh2 擴充 (0.10),在執行設定時出現此錯誤
checking for libssh2_banner_set in -lssh2... no
configure: error: libssh2 version >= 0.4 not found
我在設定檔中進行了一些探查並追蹤到問題。失敗的原因是設定正在嘗試使用 -ldl 編譯測試程式。libdl 並未安裝在 OpenBSD 3.9 上。OpenBSD 人員多年前已清除 libdl,而且我找不到包含它的套件。
(上面的錯誤訊息具有誤導性,因為問題不在於 libssh2。)
我查看了 ssh2 擴充程式碼,並沒有看到使用 libdl 的原因,所以我從 config.m4 檔案中刪除了 -ldl。重新執行 phpize 和設定。沒有錯誤。執行 make 並安裝 ssh2.so。運作正常。
若要列出目錄內容
<?php
$connection = ssh2_connect(\"hostname\", 22);
ssh2_auth_password($connection,\"username\", \"password\"); // 或使用任何 ssh2_auth_* 方法
$sftp = ssh2_sftp($connection);
$dh = opendir(\"ssh2.sftp://$sftp/path/to/dir/\");
while (($file = readdir($dh)) !== false) {
echo \"$file is in hostname:/path/to/dir\\n\";
}
closedir($dh);
?>
(感謝 Sara 的協助)
嘗試為 Mac OS X (10.4.2) 編譯此 ssh PECL 擴充
使用 entropy.ch 的 php5 發行版?請繼續閱讀:第 1 部分
1) 下載 libssh(我使用的是 0.11 版)
http://sourceforge.net/project/showfiles.php?group_id=125852
2) 解壓縮目錄,並使用終端機 cd 至解壓縮的目錄。
3) 執行:./configure; make all install;
libssh 應編譯並將輸出檔案放置在 src/*.o 中
4) 將 libssh2 目錄中 include 資料夾內的所有標頭檔複製到
/usr/local/include/
5) 將 libssh2 目錄中 src 資料夾內的所有編譯檔案 (*.o) 複製到
/usr/local/lib/
6) 下載 ssh2
(我使用的是 0.9 版本,並從 cvs 進行額外變更 - 如下所述)
http://pecl.php.net/package/ssh2
7) 解壓縮下載的壓縮檔。
8) 0.9 版本與某些 ZEND 標頭檔中使用的現有符號衝突...
cvs 中提供了一個變更,將 ssh2 中的符號重新命名以避免衝突
http://cvs.php.net/diff.php/pecl/ssh2/ssh2.c?r1=1.9&r2=1.10&ty=h
至少下載 ssh2.c 的 1.10 版本
如果您決定下載更新的版本,請下載任何相關的對應檔案,
例如 php_ssh2.h 標頭檔。
9) 將舊版本的 ssh2.c 替換為新版本的 ssh2.c
(以及您下載的任何其他檔案)。
10) 從終端機
cd 到原始碼目錄(對我來說是 ssh2-0.9/ssh2-0.9/)。
(續於 PART 2 註解中)
嘗試為 Mac OS X (10.4.2) 編譯此 ssh PECL 擴充
搭配 entropy.ch 的 php5 發行版?繼續閱讀:PART 2
11) 使用 SHELL$ "echo $PATH" 檢查您 shell 的路徑變數。
如果您的 php5 二進位目錄未列在標準 OS X 二進位目錄之前,
請更新您的 $PATH 變數,將其列在最前面。我的讀取為
/usr/local/mysql/bin/: /usr/local/php5/bin/: /bin:/sbin: /usr/bin:/usr/sbin
11a) 如果您不執行此步驟,PECL 擴充功能將會連結到舊版的
Mac OS X 隨附的 php4 版本。您會知道這一點,因為
下一步列出的伺服器 API 與 phpinfo() 的輸出不同
我的版本是 20041030,Apple 的版本是 20020429。
12) 執行:phpize && ./configure --with-ssh2 && make
這會產生大量的輸出,可能還有一些警告。如果您在最後看到
「Build Complete」的訊息,則表示此過程已完成
(可能已成功)。此命令已在 ssh2-0.9 (或任何版本) 目錄中產生輸出檔案 ssh2.so。
ssh2-0.9(或任何版本)目錄中。
13) 執行下列命令檢查擴充功能目錄的位置
SHELL$/usr/local/php5/bin/php-config --extension-dir
如果它列出實際上存在的某些目錄,請將 ssh2.so 檔案複製到該目錄。
如果它沒有列出存在的目錄,您可以建立該位置,或
選擇不同的位置並更新您的 php.ini 檔案中的行
extension_dir = "./"
以指向您想要使用的目錄。我選擇了
extension_dir = "/usr/local/php5/extensions/"?>
14) 將以下行加入
extension=ssh2.so
到您的 php.ini 檔案的動態擴充功能區域。
15) 重新啟動您的網頁伺服器以載入擴充功能。如果出現任何問題,它們會寫入網頁伺服器日誌。
16) 執行以下命令檢查您新的 ssh 基礎串流是否可用
SHELL$ /usr/local/php5/bin/php -r "print_r(stream_get_wrappers());"
您應該會得到類似以下的輸出
Array
(
[0] => php
[1] => file
[2] => http
[3] => ftp
[4] => compress.bzip2
[5] => compress.zlib
[6] => https
[7] => ftps
[8] => ssh2.shell
[9] => ssh2.exec
[10] => ssh2.tunnel
[11] => ssh2.scp
[12] => ssh2.sftp
)
您現在應該可以執行所有您需要用 ssh 執行的酷炫功能
(例如 sftp scp ssh 執行)!請查看這裡的一些註解,了解一些
範例腳本來測試功能
http://us2.php.net/manual/en/ref.ssh2.php
祝您好運...希望這能減少您的頭痛!:)
某些 PHP 5 的安裝可能會在將 SSH2 擴充功能作為 Windows 服務啟動時發生問題。它今天才開始發生在我身上,而且是自發發生的。我的 PHP 版本是 5.2.2(並且已嘗試 5.2.3),在 Apache 2.0.59 上執行。
事實證明這是 Apache 的問題。即使我在啟動它時收到錯誤訊息,它仍然可以從 CLI 完美運作。因此,我再次在
INI 檔案中將其註解掉,然後僅從腳本中使用 extension_loaded('ssh2') 和 dl('php_ssh2.dll') 來載入它。