[PHP-users 7160] ftp_loginした後の動作

Shiori Tanianka php-users@php.gr.jp
Fri, 26 Apr 2002 15:57:41 +0900


谷中と申します。

ftp_login() 〜 ftp_close() の間に書いた処理が
どうしても正常に動作しないのでご相談させてください。

やろうとしていることは以下の2点の処理です。
1. ローカル上にあるディレクトリのファイルリストを取得
2.それらのファイルをftp関数を利用して、他マシンへアップロード

これを行うため、以下のようなソースを書きました。

--------------ここからソース---------------------
<?php
//ファイルリスト取得
$i=0;
$handle = opendir("/tmp");
while (false !== ($file = readdir($handle))) {
     if ($file != "." && $file != "..") {
         $file_list[$i] = $file;
	print $file_list[$i]."<BR>\n";		//	----A
	$i++;
     }
}
closedir($handle);

print "---";

// FTP接続
$conn=ftp_connect("hoge.hoge");
$rtn=ftp_login($conn,"id","pw");
if ((!$conn) || (!$rtn)){
	print "Login Fail";
	return;
}

print "---";

$i=0:
while ($file_list[$i]) {
	print $file_list[$i]."<BR>\n";		//	----B
//	実際はここでftp_putする
	$i++;

}

ftp_quit($conn);

$i=0:
while ($file_list[$i]) {
	print $file_list[$i]."<BR>\n";		//	----C
	$i++;
}
?>
--------------ここまでソース---------------------

%>ls /tmp は、以下の通りです。
file1
file2
file3

このソースを実行すると、以下のような出力になります。

file1
file2
file3
---
file2
file3
---
file1
file2
file3

つまり/tmp には、file1〜file3がありまして、
それを配列($file_list)に格納。
次にftp_login した後で「試しに」file_list[]を表示してやろうとすると
$file_list[0](=file1)が抜けてしまいます。
その後、ftp_closeした後で、再度file_list[]を表示してやると
file1〜file3まで正常に表示されます。

本当はftp_put()をBの後に記述したいわけですが、
それがうまくいかず、試しに$file_listの内容を表示させてみたら
上記のように「1番目」の配列に値が入ってないようになるのです。

また、Bのとこでwhileループではなく、ベタで
print $file_list[0];
print $file_list[1];
print $file_list[2];
とやっても結果は同様です。

さらに、Bのwhileループにおいて、$i=1; として
実行すると、結果は、

file3

だけが表示されます。
つまりどうしても「1番目」の値が抜けてしまうようです。
それがftp_login〜ftp_close の間に書いた処理だけ
こうなってしまいます。
BとCのロジックは全く同様なので、どう考えても
ftp_connect〜ftp_close間だけ動作がおかしくなる、としか
考えられないのですが、いかがでしょうか?
(他にもftp_login〜close の中でopendir して、ファイルリストを
表示させようとしても同様なのです。)
もちろんfile1は存在してますし、壊れてもいません。

MLの過去記事を検索したところ、putがうまくいかない時にPASVモードにすると
うまくいくという記事があったので、これも試しましたが
今回のケースではダメなようです。

環境は以下の通りです。
OS: RedHat Linux 6.2J
Apache1.3.23
PHP 4.1.2(DSO)

Configure Option:
--without-mysql
--with-pgsql=/usr/local/pgsql
--with-sybase=/usr/local/freetds
--enable-calendar
--enable-ctype
--enable-ftp
--with-imap
-- enable-mbstring
--enable-mbstr-enc-trans
--enable-sockets
--with-apxs=/usr/local/apache/bin/apxs

もしかしたらOSのライブラリがおかしいのかな?と思い、
Sun Solaris7(Apache,phpのバージョンは同じ。コンフィグオプションも同じ)で
試しても結果は全く同様でした。


何かご存じの方はご教授いただけないでしょうか?
よろしくお願いいたします。


// MTI Ltd.   IT Division
// Manager
// Shiori Taninaka <taninaka_s@mti.co.jp>
// Tel 03-5325-6211
// Fax 03-5325-6223
// Cellular Phone : 090-9320-0607
// Cellular E-Mail : taninaka@ezweb.ne.jp