現在の位置: ホーム> 最新記事一覧> FSOCCKOPEN関数を介してFTPファイルのアップロードを実装する詳細な方法は何ですか?どのような重要なポイントに注意を払う必要がありますか?

FSOCCKOPEN関数を介してFTPファイルのアップロードを実装する詳細な方法は何ですか?どのような重要なポイントに注意を払う必要がありますか?

gitbox 2025-08-25

PHPでは、 FSOCCKOPEN()関数を使用してFTPファイルアップロードを実装するプロセスは、FTPプロトコルの手動操作を含む比較的低レベルです。 PHPはFTP_*の一連の関数を提供してFTPアップロードプロセスを簡素化しますが、特別なニーズに遭遇したり、アップロードプロセスをより詳細に制御するために、 FSOCCKOPEN()を介して直接実装することもあります。この記事では、FSockkopen()を介してFTPファイルのアップロードを実装する方法を詳細に紹介し、特別な注意が必要ないくつかの重要なポイントを指摘します。

1。基本概念

FTP(ファイル転送プロトコル)は、クライアントとサーバー間でファイルを転送するために使用される一般的に使用されるネットワークプロトコルです。 FSOCCKOPEN()関数を使用して、FTPサーバーと対話してアップロード、ダウンロード、その他の操作を実行して、PHPのFTPサーバーへのソケット接続を開くことができます。

2。fsockopen ()を介してファイルをアップロードする基本的なプロセス

  1. 接続を確立<br> まず、 fsockkopen()を使用してFTPサーバーへの接続を開く必要があります。通常、FTPサーバーのデフォルトポートは21です。

     <span><span><span class="hljs-variable">$ftp_server</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">// に作成しますFTPサーバー接続</span></span><span>
    </span><span><span class="hljs-variable">$ftp_socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>, </span><span><span class="hljs-variable">$ftp_port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$ftp_socket</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"FTP接続に失敗しました: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)");
    }
    </span></span>
  2. サーバーの応答を受信します
    FTPは通常、接続が確立されたときにウェルカムメッセージを送信します。接続を成功させるために、サーバーの応答を読み取り、確認する必要があります。

     <span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'220'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"接続に失敗しました: <span class="hljs-subst">$response</span></span></span><span>");
    }
    </span></span>
  3. ユーザー名とパスワードを送信<br> FTPプロトコルでは、ログインプロセスは、username(user)and password(pass)コマンドを送信することで実行されます。 fputs()関数を使用してこれらのコマンドを送信できます。

     <span><span><span class="hljs-comment">// ユーザー名を送信します</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"USER <span class="hljs-subst">$ftp_user</span></span></span><span>\r\n");
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'331'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"ユーザー名のエラー: <span class="hljs-subst">$response</span></span></span><span>");
    }
    
    </span><span><span class="hljs-comment">// パスワードを送信します</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"PASS <span class="hljs-subst">$ftp_pass</span></span></span><span>\r\n");
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'230'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"エラーパスワード: <span class="hljs-subst">$response</span></span></span><span>");
    }
    </span></span>
  4. パッシブモードを設定する(オプション)
    一部のネットワーク環境では、パッシブモード(PASV)を使用する方が安定しています。パッシブモードは、FTPサーバー側の新しいポートを開き、クライアントはデータ送信のためにこのポートに接続します。

     <span><span><span class="hljs-comment">// パッシブモードを入力します</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"PASV\r\n"</span></span><span>);
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'227'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"パッシブモードを入力します失败: <span class="hljs-subst">$response</span></span></span><span>");
    }
    </span></span>

    サーバーによって返される応答には、データポートに関する情報が含まれており、データポートを取得するためにこの応答を解析する必要があります。

  5. ファイルをアップロード<BR> ファイルをアップロードするには、ファイルのアップロード場所を指定してStorコマンドを送信し、ファイルコンテンツをブロックごとにサーバーブロックに転送する必要があります。

     <span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'local_file.txt'</span></span><span>;
    </span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'remote_file.txt'</span></span><span>;
    
    </span><span><span class="hljs-comment">// ローカルファイルを開きます</span></span><span>
    </span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$file</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"无法ローカルファイルを開きます: <span class="hljs-subst">$local_file</span></span></span><span>");
    }
    
    </span><span><span class="hljs-comment">// 送信 STOR コマンドアップロードが始まります</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"STOR <span class="hljs-subst">$remote_file</span></span></span><span>\r\n");
    </span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$response</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>) != </span><span><span class="hljs-string">'150'</span></span><span>) {
        </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"アップロードに失敗しました: <span class="hljs-subst">$response</span></span></span><span>");
    }
    
    </span><span><span class="hljs-comment">// ブロックごとにファイルコンテンツをアップロードします</span></span><span>
    </span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
        </span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
        </span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
    }
    
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
    </span></span>
  6. 接続を閉じます<br> ファイルをアップロードした後、FTP接続を閉じます。

     <span><span><span class="hljs-title function_ invoke__">fputs</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>, </span><span><span class="hljs-string">"QUIT\r\n"</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$ftp_socket</span></span><span>);
    </span></span>

3。キーポイントと予防策

  1. エラー処理
    FTPプロトコルには複数のコマンドと応答が含まれるため、エラー処理は非常に重要です。各FTPコマンドの応答には、3桁のステータスコード(220、230、331など含まれています。これらのステータスコードを確認することにより、操作が成功しているかどうかを判断できます。

  2. パッシブモードとアクティブモード<br> 一部のネットワーク環境では、パッシブモードを使用すると、NAT(ネットワークアドレス変換)デバイスとファイアウォールのブロッキングを回避できます。デフォルトモードが適切でない場合は、パッシブモードに切り替えることを忘れないでください。

  3. バイナリおよびASCIIモード<br> ファイルをアップロードするときは、ファイル転送モードの正しい設定を確認する必要があります。バイナリファイル(写真、ビデオ、圧縮ファイルなど)の場合、バイナリモード(つまり、タイプI )を使用する必要があります。テキストファイルの場合、ASCIIモード(つまり、タイプA )を使用します。

  4. バッファサイズ<BR> ファイルのアップロード中、操作を読み書きするときは、バッファサイズを調整することでアップロードのパフォーマンスを向上させることができます。 fread()fputs()のバッファサイズは、データ送信の速度に影響します。

  5. リソースの漏れを防ぐ<br> fsocopen()を介してソケット接続を作成した後、リソースの漏れを避けるために、アップロードが完了した後、接続を閉じることを忘れないでください。

4。概要

FSOCCKOPEN()を介してFTPファイルのアップロードを実装することは比較的低レベルですが、開発者はファイル転送をより多く制御できます。 FTPプロトコルの各ステップを手動で実装することにより、複雑なシナリオでカスタマイズされた操作を実行できます。ただし、それを使用する場合は、アップロードプロセスのスムーズな進行を確保するために、プロトコル、エラー処理、送信モード、その他の問題の詳細に注意を払う必要があります。通常のファイルアップロード要件の場合、PHPの内蔵FTP関数を使用して操作を簡素化できますが、 FSOCKOPEN()を介したカスタマイズされたアップロード操作は、より詳細な制御を必要とするシナリオに適しています。

  • 関連タグ:

    FTP