現在の位置: ホーム> 最新記事一覧> FTP_RAWLISTを組み合わせて、自動展開スクリプトを作成します

FTP_RAWLISTを組み合わせて、自動展開スクリプトを作成します

gitbox 2025-06-17

1。準備

まず、PHP環境がFTP機能をサポートしていることを確認する必要があります。それが有効になっているかどうかを確認できます。

 <span><span><span class="hljs-title function_ invoke__">phpinfo</span></span><span>();
</span></span>

出力のFTPセクションを見つけて、FTP拡張が有効になっていることを確認してください。有効になっていない場合、 php.iniファイルを変更することで拡張機能を有効にできます。

 <span><span><span class="hljs-attr">extension</span></span><span>=ftp
</span></span>

次に、Webサーバーを再起動します。

2。FTPサーバーに接続します

PHPが提供するFTP_CONNECTおよびFTP_LOGIN関数を使用して、FTPサーバーに接続する必要があります。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</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-comment">// FTP サーバーアドレス</span></span><span>
</span><span><span class="hljs-variable">$ftp_user_name</span></span><span> = </span><span><span class="hljs-string">"username"</span></span><span>;     </span><span><span class="hljs-comment">// FTP ユーザー名</span></span><span>
</span><span><span class="hljs-variable">$ftp_user_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-comment">// に接続します FTP サーバ</span></span><span>
</span><span><span class="hljs-variable">$conn_id</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</span></span><span>);

</span><span><span class="hljs-comment">// ログイン FTP サーバ</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_id</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_name</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_pass</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"成功に接続します <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
} </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 class="hljs-subst">$ftp_server</span></span></span><span>\n";
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

上記のコードは、 FTP_Connectを介してFTPサーバーに接続し、認証にFTP_LOGINを使用します。

3. FTP_RAWLISTを使用して、ファイルとディレクトリリストを取得します

FTP_RAWLIST関数は、サーバーによって指定されたディレクトリの元のリストを返します。このリストには、アクセス、サイズ、日付など、各ファイルまたはディレクトリの詳細が含まれています。この情報を分析することにより、ファイルが既に存在するかどうかを判断し、アップロードまたは上書きするかどうかを決定できます。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// ルートディレクトリのファイルリストを取得します</span></span><span>
</span><span><span class="hljs-variable">$remote_dir</span></span><span> = </span><span><span class="hljs-string">"/"</span></span><span>;
</span><span><span class="hljs-variable">$file_list</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_dir</span></span><span>);

</span><span><span class="hljs-comment">// 取得したファイルリストを出力します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$file_list</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

上記のコードを実行した後、次の形式と同様のファイルのリストが返されます。

 <span><span>Array
(
    [0] =&gt; drwxr-xr-x   2 1000 1000  4096 May  7 12:30 public_html
    [1] =&gt; -rw-r--r--   1 1000 1000  2048 May  7 12:35 index.php
    [2] =&gt; -rw-r--r--   1 1000 1000  1024 May  7 12:36 style.css
)
</span></span>

この情報を分析することにより、スクリプトを記述して、ファイルが既に存在するかどうかを確認するか、ファイルの変更時間を取得して、ファイルをアップロードする必要があるかどうかを判断できます。

4.ローカルファイルとリモートファイルを比較します

ローカル展開フォルダーがあり、リモートサーバー上のファイルと比較したいとします。 FTP_RAWLISTを使用して、リモートファイルのタイムスタンプとサイズを取得し、ローカルファイルの情報を組み合わせてアップロードするかどうかを決定できます。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// ローカルファイルパス</span></span><span>
</span><span><span class="hljs-variable">$local_file</span></span><span> = </span><span><span class="hljs-string">'path/to/local/index.php'</span></span><span>;
</span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-string">'index.php'</span></span><span>;

</span><span><span class="hljs-comment">// ローカルファイルの変更時間を取得します</span></span><span>
</span><span><span class="hljs-variable">$local_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filemtime</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>);

</span><span><span class="hljs-comment">// リモートファイルに関する詳細情報を入手してください</span></span><span>
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>);
</span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">explode</span></span><span>(</span><span><span class="hljs-string">" "</span></span><span>, </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
</span><span><span class="hljs-variable">$remote_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtotime</span></span><span>(</span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">5</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">6</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">7</span></span><span>]);

</span><span><span class="hljs-comment">// ファイル時間を比較します,アップロードするかどうかを決定します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file_time</span></span><span> &gt; </span><span><span class="hljs-variable">$remote_file_time</span></span><span>) {
    </span><span><span class="hljs-comment">// ファイルをアップロードします</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>, FTP_BINARY)) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"書類 <span class="hljs-subst">$local_file</span></span></span><span> 正常にアップロードします!\n";
    } </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 class="hljs-subst">$local_file</span></span></span><span> アップロードに失敗しました!\n";
    }
} </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">"远程書類已经是最新的,アップロードは必要ありません。\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

5。自動展開スクリプト

次に、すべての部品を組み合わせて、自動展開スクリプトを作成します。このスクリプトは、どのファイルを更新してリモートサーバーにアップロードする必要があるかを自動的に決定します。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</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_user_name</span></span><span> = </span><span><span class="hljs-string">"username"</span></span><span>;
</span><span><span class="hljs-variable">$ftp_user_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">$conn_id</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_connect</span></span><span>(</span><span><span class="hljs-variable">$ftp_server</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_id</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_name</span></span><span>, </span><span><span class="hljs-variable">$ftp_user_pass</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法に接続します <span class="hljs-subst">$ftp_server</span></span></span><span>\n";
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}

</span><span><span class="hljs-comment">// 本地部署書類夹</span></span><span>
</span><span><span class="hljs-variable">$local_dir</span></span><span> = </span><span><span class="hljs-string">"path/to/local/files/"</span></span><span>;
</span><span><span class="hljs-variable">$remote_dir</span></span><span> = </span><span><span class="hljs-string">"/"</span></span><span>;

</span><span><span class="hljs-comment">// 获取本地書類列表</span></span><span>
</span><span><span class="hljs-variable">$local_files</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RecursiveIteratorIterator</span></span><span>(
    </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">RecursiveDirectoryIterator</span></span><span>(</span><span><span class="hljs-variable">$local_dir</span></span><span>),
    </span><span><span class="hljs-title class_">RecursiveIteratorIterator</span></span><span>::</span><span><span class="hljs-variable constant_">LEAVES_ONLY</span></span><span>
);

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$local_files</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$local_file</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">isDir</span></span><span>()) {
        </span><span><span class="hljs-keyword">continue</span></span><span>;
    }

    </span><span><span class="hljs-comment">// 相対パスを取得します</span></span><span>
    </span><span><span class="hljs-variable">$relative_path</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$local_dir</span></span><span>));

    </span><span><span class="hljs-comment">// リモートファイルに関する詳細情報を入手してください</span></span><span>
    </span><span><span class="hljs-variable">$remote_file</span></span><span> = </span><span><span class="hljs-variable">$remote_dir</span></span><span> . </span><span><span class="hljs-variable">$relative_path</span></span><span>;
    </span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftp_rawlist</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>);
    
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$remote_file_info</span></span><span>) {
        </span><span><span class="hljs-comment">// 書類已存在,時間を比較します</span></span><span>
        </span><span><span class="hljs-variable">$remote_file_info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">explode</span></span><span>(</span><span><span class="hljs-string">" "</span></span><span>, </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
        </span><span><span class="hljs-variable">$remote_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtotime</span></span><span>(</span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">5</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">6</span></span><span>] . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$remote_file_info</span></span><span>[</span><span><span class="hljs-number">7</span></span><span>]);
        </span><span><span class="hljs-variable">$local_file_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filemtime</span></span><span>(</span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>());

        </span><span><span class="hljs-comment">// 如果本地書類较新,アップロード</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$local_file_time</span></span><span> &gt; </span><span><span class="hljs-variable">$remote_file_time</span></span><span>) {
            </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), FTP_BINARY)) {
                </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"書類 <span class="hljs-subst">$relative_path</span></span></span><span> 正常に更新します!\n";
            } </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 class="hljs-subst">$relative_path</span></span></span><span> 更新に失敗しました!\n";
            }
        }
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-comment">// 書類不存在,直接アップロードします</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ftp_put</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>, </span><span><span class="hljs-variable">$remote_file</span></span><span>, </span><span><span class="hljs-variable">$local_file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getRealPath</span></span><span>(), FTP_BINARY)) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"書類 <span class="hljs-subst">$relative_path</span></span></span><span> 正常にアップロードします!\n";
        } </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 class="hljs-subst">$relative_path</span></span></span><span> アップロードに失敗しました!\n";
        }
    }
}

</span><span><span class="hljs-comment">// 閉鎖 FTP 接続する</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ftp_close</span></span><span>(</span><span><span class="hljs-variable">$conn_id</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

6。概要

FTP_RAWLIST関数を使用すると、リモートサーバー上のファイルの詳細情報を簡単に取得できます。ファイルの変更時間とサイズに基づいて、新しいファイルをアップロードするか、既存のファイルを上書きする必要があるかどうかを判断できます。この方法は、自動展開に非常に適しており、手動操作を効果的に削減し、展開効率を改善できます。

このシンプルなPHPスクリプトを使用すると、FTPのアップロードと自動展開を組み合わせて、よりインテリジェントなファイルの同期と更新を実現できます。