1

これを解決するために半日を失ったので、ここで私の問題 (および解決策) を共有する価値があると思います。

これが私の最初のコードです:

$host = ...
$user = ...
$pass = ...
$conn = ftp_ssl_connect($host, 22);
if($conn === false) {
    die('could not connect :(');
}

$login_result = ftp_login($conn, $user, $pass);
ftp_pasv($conn, true);
$file = realpath('test.txt');
echo 'putting file '.$file."\n";
ftp_put($conn, 'test.txt', $file, FTP_BINARY);
ftp_close($conn);

残念ながら、接続が成功しても、これは機能しませんでした。以下は、約 1 分間ハングした後に fpt_put 行から得たメッセージです。

警告: ftp_put(): php_connect_nonb() が失敗しました: 操作が進行中です (36)

ほとんどの同様の問題で見られるように、これは受動的なトグルの問題ではないことに注意してください (私はあり、なしで試しました)。

注: 通常はポート 21 が使用されることは承知していますが、サード パーティを使用している場合は選択の余地がない場合があります。

4

1 に答える 1

2

これが解決策であり、正しい方法を示してくれたこのブログ投稿http://www.elitehosts.com/blog/php-ftp-passive-ftp-server-behind-nat-nightmare/に感謝します.. .

基本的に、修正が PHP に追加されたようで、FTP_USEPASVADDRESS オプションがトリックを実行します。つまり、パッシブ モードに切り替える直前にオプションを設定します。

$host = ...
$user = ...
$pass = ...
$conn = ftp_ssl_connect($host, 22);
if($conn === false) {
    die('could not connect :(');
}

$login_result = ftp_login($conn, $user, $pass);
//ADD THIS ⬇︎
ftp_set_option($conn, FTP_USEPASVADDRESS, false);
//ADD THIS ⬆︎
ftp_pasv($conn, true);
$file = realpath('test.txt');
echo 'putting file '.$file."\n";
ftp_put($conn, 'test.txt', $file, FTP_BINARY);
ftp_close($conn);

そして、これは機能します:D. これが誰かを助けることを願っています...

于 2019-09-19T13:09:36.790 に答える