2012-03-01 5 views
0

fopenでファイルを開き、コンテンツ全体を読み取る必要があります。 ファイルには、SSH-SFTP接続を介してアクセスできます:sshでfopenを実行してもファイル全体が取得されない

//ssh connection 
$connection = ssh2_connect($host, $port); 
//open the file 
$handle = fopen("ssh2.sftp://$sftp".$file, "r"); 
$out = array(); 
//read the file 
while (($fields = fgetcsv($handle, 0, ";")) !== FALSE) { 
    $out[]=$fields; 
} 

ファイルが実際にCSVいずれかです。

がここで開かれ、接続してファイルを読むために私のコードです。 fgetcsvを使用して、ファイルを行単位で読み込みます。 しかし、たとえ私のファイルが約20行後に50行と言っても、fgetcsvは失敗し、最終的な配列は不完全です。 ファイルには、私のマシン上で、実際にローカルである:SSH経由開いた場合は、直接ファイルシステムパスで正常に開かれている場合のみ、最初の20行が、読まれています。

fopen("localpath", "r"); 

whileループは、すべての50行を読み取ります。

ssh接続から読み込むときに、バイト数に制限はありますか?この制限はphp.ini設定オプションで変更できますか?

答えて

1

file_get_contents()を使用してファイル全体を取得してから、CSVデータを解析してみます。

+0

試しました。しかし何も変わっていない。実際にはファイルの最初の8192バイトしか受信できません。私もssh2_scp_recvを試しました。この場合も元のファイルが15kbyteであっても、scpから取ったファイルは8kbyteです。どこかに8kbyteの限界があるようです。 –

+0

詳細をお知らせください。 OS/PHP版/ Apache版など – rkosegi

+0

私はPHPの5.1でlinux red hat entrprise 6.0を実行します。私は問題を解決することができました。実際、私がアクセスしようとしていたリモートファイルは、私のfopenが動作する前に、舞台裏で作成されています。 「場面の背後にある」コードはfreadを使用してファイルを作成します(別の元のファイルから読み込みます)。 php 5.1 freadでは、このバグhttps://bugs.php.net/bug.php?id=35859&edit=2が表示されます:ファイルを読むときの制限は8kです。あなたの提案をありがとう –

3

私のお勧めは、phpseclib, a pure PHP SFTP implementationです。例えば。あなたはそれがめちゃくちゃだ場所を正確に見ることができるように

<?php 
include('Net/SFTP.php'); 

$sftp = new Net_SFTP('www.domain.tld'); 
if (!$sftp->login('username', 'password')) { 
    exit('Login Failed'); 
} 

$csv = $sftp->get('filename.ext'); 

$handle = fopen('php://memory', 'r+'); 
fputs($handle, $csv); 
rewind($handle); 

while (($fields = fgetcsv($handle, 0, ";")) !== FALSE) { 
    $out[]=$fields; 
} 
?> 

としても、それは動作しません(と私はそれが希望良いチャンスがあると思う)場合phpseclibはロギングをサポートしています。 SSHサーバーの問題で、SSHパケットが戻ってきて、「サーバーが8kを超えるファイルを送信することをサポートしていません」というメッセージが表示されます。もしそうならば、libssh2はあなたに言いませんが、phpseclibは(デフォルトで有効になっていないロギングを有効にした場合)可能性があります。

とにかく、それを試してみてください。私はあなたがそれを必要とすればそこからあなたを助けます!

0

私は正確に問題を明確にするために自分の質問に答えるよ:

私はLinuxの赤い帽子は、PHP 5.1で6.0をentrprise実行します。私は問題を解決することができました。実際、私がアクセスしようとしていたリモートファイルは、私のfopenが動作する前に、舞台裏で作成されています。 「場面の背後にある」コードはfreadを使用してファイルを作成します(別の元のファイルから読み込みます)。 php 5.1 freadではこのバグを示しています。bugs.php.net/bug.php?id=35859 & edit = 2:ファイルを読むときの制限は8kです。だからそれ以降はさまざまな方法でファイルにアクセスできますが、それでもサイズは8kで他のコンテンツは失われます。

関連する問題