fopen через ssh не получает весь файл - PullRequest
0 голосов
/ 01 марта 2012

Мне нужно открыть файл с помощью fopen и прочитать все содержимое. Файл доступен через соединение ssh-sftp:

Вот мой код для подключения, открытия и чтения файла:

//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 я читаю файл строка за строкой. Но даже если в моем файле, скажем, 50 строк после примерно 20 строк, fgetcsv завершится неудачно, и мой окончательный массив out будет неполным. Файл фактически локальный на моей машине: если открыть через ssh, будут прочитаны только первые 20 строк, если они открываются нормально с прямым путем к файловой системе:

fopen("localpath", "r");

Цикл while читает все 50 строк.

Есть ли ограничение в байтах при чтении из ssh-соединения? Можно ли изменить это ограничение с помощью параметра конфигурации php.ini?

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Моя рекомендация: попробуйте phpseclib, чистая PHP-реализация SFTP . например.

<?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-пакет с сообщением «сервер не поддерживает отправку файлов размером более 8 КБ». Если бы это было так, libssh2 не сообщит вам, тогда как phpseclib может (ну, если вы включите ведение журнала, которое по умолчанию не включено).

В любом случае, просто попробуй это. Я помогу вам оттуда, если вам это нужно!

1 голос
/ 01 марта 2012

Попробуйте извлечь весь файл с помощью file_get_contents (), а затем выполните анализ CSV-данных.

0 голосов
/ 24 марта 2012

Я отвечаю на свой вопрос, чтобы прояснить проблему:

Я запускаю Linux Red Hat Entrprise 6.0 с PHP 5.1.Мне удалось решить проблему: на самом деле удаленный файл, к которому я пытался получить доступ, был создан за кулисами, до того, как мой fopen запустится.код "за кулисами" использует fread для создания файла (чтение из другого исходного файла).В php 5.1 fread показывает эту ошибку bugs.php.net/bug.php?id=35859&edit=2: ограничение в 8 КБ при чтении файла.Таким образом, после этого он может получить доступ к файлу разными способами, но все равно его размер составляет 8 КБ, а другой контент теряется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...