PHPの非ブロッキングFTP操作機能FTP_NB_CONTINUE()を使用する場合、多くの開発者は困難な問題に遭遇します。プログラムは「スタック」されているようで、エラーを返したり実行し続けたりしません。 FTPセッションは予期しない待機状態にあるため、これはよく当てはまります。この記事では、 FTP_NB_CONTINUE()の一般的な原因を詳細に紹介し、ブロックやタイムアウトの問題を避けるためにいくつかの効果的なソリューションを提供します。
FTP_NB_CONTINUE()は、非ブロッキング伝送関数( FTP_NB_GET()やFTP_NB_PUT()など)で使用されます。その機能は、未完成のFTP操作を継続することです。非ブロック送信の利点は、送信が完了するのを待っている間、他のロジックを処理し続けることができることです。
典型的なブロッキングのダウンロードプロセスは次のとおりです。
<code> $ ftp = ftp_connect( 'gitbox.net'); ftp_login($ ftp、 'username'、 'password'); $ ret = ftp_nb_get($ ftp、 'local_file.txt'、 'remote_file.txt'、ftp_binary); while($ ret == ftp_moredata){
//他のタスクを実行できます
do_something_else();
// 転送を続けます
$ret = ftp_nb_continue($ftp);
}
</code>
とてもシンプルに見えますよね?しかし、実際にそれを使用すると、多くの人がこのサイクルに「立ち往生」しています。
一部のFTPサーバーは、特定の状態での応答を遅らせます。特に、データを要求しすぎたり、ネットワーク条件が不十分な場合。これにより、 FTP_NB_CONTINUE()がFTP_MOREDATA状態にとどまり、終了しません。
解決:
合理的なタイムアウトを設定します:
<code> ftp_set_option($ ftp、ftp_timeout_sec、30); </code>Stream_set_timeout()を使用して、より細かい粒状制御を取得します(FTPの基礎となるストリームを取得する必要があります)。
多くの開発者は、非ブロッキングループを作成するときにWhileループに遅延を追加することを忘れて、CPUの使用が急上昇し、FTPサーバーにはリクエストに応答する時間もありません。
解決:
<code> while($ ret == ftp_moredata){do_something_else(); USLoop(100000); // 100ms $ $ ret = ftp_nb_continue($ ftp); } </code>一部のFTPサーバーは、送信が完了した後、ステータスコードを正しく返しません。FTP_NB_CONTINUE()は、送信が完了したと判断できません。
解決:
ローカルファイルサイズが期待を満たしているかどうかを確認してください。
再試行時間の最大数を設定します:
<code> $ maxtries = 100; $ tries = 0; while($ ret == ftp_moredata && $ tries <$ maxtries){
USLoop(100000);
$ ret = ftp_nb_continue($ ftp);
$ tries ++;
}
if($ tries == $ maxtries){
新しい例外をスロー( 'FTP送信タイムアウト');
}
</code>
さまざまなサーバーは、アクティブ(ポート)およびパッシブ(PASV)モードをサポートせず、誤った設定により接続の確立が発生する可能性がありますが、データを正しく転送できません。
解決:
<code> ftp_pasv($ ftp、true); //パッシブモードを有効にする</code>アクティブ/パッシブモードを切り替えて、FTPサービスとより互換性のあるものを確認してください。
非ブロッキングモードを使用する場合は、必ず終了メカニズムを設計してください。
サイクルに合理的な遅延が追加されるようにします。
タイムアウトと最大試行回数を設定します。
長い期間の遅れに遭遇した場合は、FTPモードを切り替えてみてください。
リソースをリリースすることを忘れないでください:
<code> ftp_close($ ftp); </code>FTP_NB_CONTINUE()は、実際にFTP操作の柔軟性を向上させることができますが、立ち往生するのも簡単です。上記のスキルを習得することにより、実際の開発でのブロック、ジャミング、および過度のCPU使用を避けることができ、PHP FTPプログラムをより安定して効率的にすることができます。同様の状況に遭遇した場合は、それらを1つずつチェックして、根本原因を見つけて適切な薬を処方することもできます。