質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5889閲覧

phpでFTP経由のダウンロードに失敗する

WADA1234

総合スコア25

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/12/18 09:52

サーバーAからサーバーBのデータをFTPを使用してダウンロードしていたのですが
サーバーAのサーバーの調子が悪くなりサーバーAを初期化しました。

すると、今まで行っていたFTPでのダウンロードができなくなってしまいました。
どのような原因が考えられるでしょう。

下記がプログラムとなります。

php

1 // リモートファイルへのパス。 2 unlink( $local_file ); 3 4 5 // 書き込み用のファイルをオープンします。 6 $handle = fopen($local_file, 'w'); 7 8 9 // 接続を確立します。 10 $conn_id = ftp_connect( $ftp_server ); 11 12 // ユーザー名とパスワードを指定してログインします。 13 $login_result = ftp_login($conn_id,$ftp_user_name, $ftp_user_pw); 14 15 if ((!$conn_id)||(!$login_result)){ 16 die("error<br>"); 17 }else{ 18 echo "OK<br>"; 19 } 20 21 22 // $remote_file をダウンロードし、$handle に保存しようとします。 23 if (ftp_get($conn_id, $local_file,$remote_file, FTP_BINARY)) { 24 echo "success<br>"; 25 } else { 26 echo "error <br>"; 27 } 28 29 error_log(); 30 31 fclose($handle); 32 33 // 接続およびファイルハンドラを閉じます。 34 ftp_close($conn_id);

下記のところでerrorおり、ダウンロードに失敗します。

php

1 // $remote_file をダウンロードし、$handle に保存しようとします。 2 if (ftp_get($conn_id, $local_file,$remote_file, FTP_BINARY)) { 3 echo "success<br>"; 4 } else { 5 echo "error <br>"; 6 }

環境は
OSはcentOS 6
php 5.6
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mike2mike4

2017/12/18 10:30

サーバーの調子が悪かったとは? ハード的な問題かもしれませんよ
showkit

2017/12/18 10:48

FTP クライアントをコマンドで動かしてどうなるかをまず、試してみてください。
CHERRY

2017/12/18 14:21

ftp サーバーのログには、どのようなエラーが記載されていますか?
WADA1234

2017/12/18 14:37

サーバーのログがどこに有るかわからないのですが、/var/log/の直下に有るものでしょうか?
WADA1234

2017/12/18 14:39

コマンドで動かすと、【ftp: Can't connect to `xxx.xxxx.xxx.xxxx': Connection refused】とメッセージが返ってきます。
WADA1234

2017/12/18 14:40

ハード的な問題ってことも有るんですね。。
mike2mike4

2017/12/18 14:47

FTPサーバー起動し忘れてませんか?
WADA1234

2017/12/18 14:53 編集

FTPサーバーにサイバーダックというツールからは入れるので大丈夫だと思います。 説明文に記載すべきですね。。
mike2mike4

2017/12/18 15:27 編集

あ、クライアントはwindowsを想定してますが、コマンドはUNIX系です。PHPに僕の知識では問題が見られないと言うことと以前はうまくいっていたそうなので、サーバー側を疑ってます。
guest

回答2

0

Tomak さんのおっしゃるような切り分けが必要だと思いますが・・・蛇足ながら。
CentOS6 とのことで、ftp サーバが vsftpd であろうとの前提で・・・。
ftp のログは

/var/log/xferlog

 に出力されます。デフォルトの設定では、ファイルの送受信のログしか出ませんので

/etc/vsftpd/vsftpd.conf

 を以下のように編集して

plain

1xferlog_file=/var/log/xferlog 2vsftpd_log_file=/var/log/xferlog 3xferlog_std_format=NO 4log_ftp_protocol=YES 5dual_log_enable=YES

vsftpd を

service vsftpd restart

 で再起動してください。
接続/切断などの詳細なログが出力されるようになるはずです。

投稿2017/12/19 02:28

showkit

総合スコア1638

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WADA1234

2017/12/22 10:28

ご回答ありがとうございます。 サーバーAを初期化したのでサーバーを疑っていましたが phpで、ファイルサイズまで取得出来ることが確認できました。 新たにトピックを立てて質問しようと思います。 ありがとうございます。
guest

0

ベストアンサー

まずは、サーバー設定の問題ないのか、PHPの問題なのか問題の切り分けをするべだと思います。下記のように確認してみてはいかがでしょうか。ターミナルを開いて操作します。WindowsであればCMD、LinuxやMacOSであれば、ターミナルを開きます。

どのような不具合でも思い込みを捨てて基本に忠実に、不具合原因の**細分化(切り分け)**を行うのが良いと思います。当の私も似たような不具合でサーバー設定や、ソースコードと何時間もにらめっこしていたような経験がありますので。

※以下サーバーBとは、サーバーBのIPアドレス OR ホスト名を指します。

まずは確認から

1.pingでサーバーBが起動しているか確認

ping サーバーB //中断しない場合はコントロールキーとCキーを同時に押す Ctrl+C

2.telnetでサーバーBの20, 21ポートが解放されているか確認する(FTPソフトウェアで接続確認できる場合はこのステップをスキップします)

※Windowsは初期設定でtelnetはインストールされていないので、ここを参考にインストールします。
※FTPのポートを変更している場合は、下記21,20をそれぞれ変更します。

telnet サーバーB 21 telnet サーバーB 20

とりあえず接続のみであれば21番ポートのみの確認でも問題ありません。ダウンロード・アップロードは通常20番ポートを使用します(今回は関係ないと思いますが、PASSIVEパッシブモードでは任意のポートを使用します)。

telnetコマンドでの確認は下記が参考になると思います。
http://ash.jp/net/telnet_ftp.htm

上記で、きちんと接続ができれば、PHP側の問題ということになります。サーバーBの指定パスが正しいかも確認するべきです。

上記でも接続できない場合は、下記のような可能性があります。とりあえず、ざっと思いつくまま書き出したので他にも原因はあるかもしれません。

可能性

  • サーバーAの21, 20番ポートがファイヤーウォールなどで閉じられている(サーバーAにファイヤーウォールで接続を許可するように設定します)
  • サーバーBのFTPサーバーがダウンしている(サーバーBのFTPサーバーを起動します)
  • なんらかの理由でサーバーBのユーザー名、パスワードが変更されてしまった(正しいユーザー名、パスワードを設定します)
  • サーバーBの接続名にホスト名を使用していて、名前解決ができない(サーバーAにDNS、hosts設定をおこなうか、サーバーBのIPアドレスを直指定でFTP接続してみる)
  • サーバーBへは、プロキシサーバー経由じゃないと接続できない(サーバーAにプロキシ設定をします)

投稿2017/12/19 02:18

Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WADA1234

2017/12/22 10:30

ご回答ありがとうございます。 サーバーAを初期化したのでサーバーを疑っていましたが phpで、ファイルサイズまで取得出来ることが確認できました。 新たにトピックを立てて質問しようと思います。 ありがとうございます。 切り分けの件、大変勉強になりましたので 「ベストアンサー」とさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問