當前位置: 首頁> 最新文章列表> ftp_pasv 如何與ftp_connect 結合使用,教你一步步實現FTP連接和被動模式設置

ftp_pasv 如何與ftp_connect 結合使用,教你一步步實現FTP連接和被動模式設置

M66 2025-06-28

在使用PHP 進行FTP 操作時,我們經常會遇到連接超時或數據無法傳輸的情況。特別是在一些防火牆或NAT 網絡環境中,主動模式(Active Mode)可能會導致FTP 數據連接失敗。這時,被動模式(Passive Mode)就是解決問題的關鍵。本文將一步步帶你了解如何使用ftp_connectftp_pasv實現穩定的FTP 連接與數據傳輸。

一、了解FTP 主動與被動模式的區別

在主動模式下,客戶端發起連接到服務器的控制端口(默認21),服務器再回連客戶端的一個隨機端口傳輸數據。這在某些網絡環境下會被攔截。

在被動模式下,客戶端不僅發起控制連接,還主動發起數據連接,這種方式更容易通過防火牆和NAT。

因此,在PHP 腳本中明確開啟被動模式,是提高兼容性和傳輸成功率的重要一步。

二、使用ftp_connect建立連接

ftp_connect是PHP 的內建函數,用於連接FTP 服務器。其語法如下:

 <span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">90</span></span><span>): FTP\Connection|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>

示例代碼:

 <span><span><span class="hljs-variable">$ftp_host</span></span><span> = </span><span><span class="hljs-string">'ftp.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>;

</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_host</span></span><span>, </span><span><span class="hljs-variable">$ftp_port</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$conn</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"無法連接到 FTP 伺服器:<span class="hljs-subst">$ftp_host</span></span></span><span>");
}
</span></span>

三、使用ftp_login登錄FTP 用戶

連接建立後,我們需要使用ftp_login來登錄:

 <span><span><span class="hljs-variable">$ftp_user</span></span><span> = </span><span><span class="hljs-string">'username'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_pass</span></span><span> = </span><span><span class="hljs-string">'password'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-variable">$ftp_user</span></span><span>, </span><span><span class="hljs-variable">$ftp_pass</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"FTP 登錄失敗!"</span></span><span>);
}
</span></span>

四、設置被動模式: ftp_pasv

連接成功並登錄之後,必須在執行任何數據傳輸函數(如ftp_get , ftp_put等)之前調用ftp_pasv來啟用被動模式:

 <span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_pasv</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"無法開啟被動模式!"</span></span><span>);
}
</span></span>

設置為true表示啟用被動模式, false表示使用主動模式。

五、完整示例代碼

將以上步驟整合,得到如下完整示例:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-variable">$ftp_host</span></span><span> = </span><span><span class="hljs-string">'ftp.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_port</span></span><span> = </span><span><span class="hljs-number">21</span></span><span>;
</span><span><span class="hljs-variable">$ftp_user</span></span><span> = </span><span><span class="hljs-string">'username'</span></span><span>;
</span><span><span class="hljs-variable">$ftp_pass</span></span><span> = </span><span><span class="hljs-string">'password'</span></span><span>;

</span><span><span class="hljs-comment">// 1. 建立連接</span></span><span>
</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_host</span></span><span>, </span><span><span class="hljs-variable">$ftp_port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$conn</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"無法連接到 FTP 伺服器!"</span></span><span>);
}

</span><span><span class="hljs-comment">// 2. 登入</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_login</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-variable">$ftp_user</span></span><span>, </span><span><span class="hljs-variable">$ftp_pass</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"FTP 登錄失敗!"</span></span><span>);
}

</span><span><span class="hljs-comment">// 3. 啟用被動模式</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ftp_pasv</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>)) {
    </span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"無法開啟被動模式!"</span></span><span>);
}

</span><span><span class="hljs-comment">// 4. 示例:下載一個文件</span></span><span>
</span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'remote/path/file.txt'</span></span><span>;
</span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'local_copy.txt'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_get</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, FTP_BINARY)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件下載成功!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件下載失敗!"</span></span><span>;
}

</span><span><span class="hljs-comment">// 5. 關閉連接</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>);
</span></span>

六、注意事項

  1. ftp_pasv必須在ftp_login成功後調用。

  2. 某些FTP 服務器默認不支持被動模式,需在服務器端配置。

  3. 遇到連接問題時,使用ftp_raw查看服務器響應,可幫助排查問題。

七、結語

通過結合使用ftp_connectftp_loginftp_pasv ,我們可以在復雜網絡環境中穩定地使用FTP 進行文件傳輸。在實際開發中,這一流程尤為重要,掌握這些函數的使用可以讓你更自如地處理各種FTP 操作問題。希望本文的講解能幫你順利實現FTP 的連接與被動模式設置。