FTP操作にPHPを使用する場合、接続のタイムアウトに遭遇したり、データを転送できないことがよくあります。特に、一部のファイアウォールまたはNATネットワーク環境では、アクティブモードではFTPデータ接続が失敗する可能性があります。現時点では、パッシブモードが問題を解決するための鍵です。この記事では、 FTP_CONNECTとFTP_PASVを使用して安定したFTP接続とデータ送信を実現する方法を理解するために、段階的に説明します。
アクティブモードでは、クライアントはサーバーに接続された制御ポートを開始し(デフォルト21)、サーバーはクライアントのランダムポートに接続してデータを送信します。これは、一部のネットワーク環境で傍受することができます。
パッシブモードでは、クライアントは制御接続を開始するだけでなく、ファイアウォールとNATを通過するのが簡単なデータ接続を積極的に開始します。
したがって、PHPスクリプトのパッシブモードを明示的にオンにすることは、互換性と伝送の成功率を改善するための重要なステップです。
FTP_Connectは、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を使用してログインする必要があります。
<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_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"><?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>
FTP_LOGINが成功した後、 FTP_PASVを呼び出す必要があります。
一部のFTPサーバーは、デフォルトでパッシブモードをサポートせず、サーバー側で構成する必要があります。
接続の問題に遭遇するときは、 FTP_RAWを使用してサーバーの応答を表示して、問題のトラブルシューティングを支援します。
FTP_CONNECT 、 FTP_LOGIN、およびFTP_PASVを組み合わせることにより、FTPを使用して、複雑なネットワーク環境で安定してファイルを転送できます。実際の開発では、このプロセスは特に重要です。これらの機能の使用を習得すると、さまざまなFTP操作の問題をより簡単に処理できます。この記事の説明が、FTP接続とパッシブモードの設定をうまく実現するのに役立つことを願っています。