php fwrite () не завершает запись строковых данных в файл, почему?

Я пытаюсь записать значительный кусок данных в файл, который открывается через fopen () в php. Я использую оболочку протокола ftp, поэтому файл удален от сервера, на котором запущен код php. Файл, в который я пишу, находится на сервере Windows.

Я проверил, что файл действительно создается моим php-кодом, но проблема в том, что данные в файле либо не существуют (0 КБ), либо запись в файл прекращается преждевременно. Не уверен, почему это так.

Вот код, который я использую для обработки операции:

$file_handle = fopen($node['ftp'].$path_to_lut, "wb", 0, $node['ftp_context']);
include_once($file);

if ($file_handle)
{
     fwrite($file_handle, $string);  //$string is inside included $file
     fclose($file_handle);
} else {
     die('There was a problem opening the file.');
}

Этот код отлично работает, когда я размещаю его на своем локальном компьютере, но когда я загружаю его на свой веб-хост (Rackspace Cloud), он не работает. Это заставляет меня думать, что это проблема, связанная с конфигурацией моего сервера в Rackspace, но я хочу знать, могу ли я что-нибудь сделать со своим php-кодом, чтобы сделать его более надежным.

Есть ли идеи, как убедиться, что fwrite действительно завершает запись строки на удаленную машину?

Спасибо!

Хорошо, я изменил код, который записывает в файл следующим образом:

if ($file_handle)
{
    if ($bytesWritten = fwrite($file_handle, $string) ) {
        echo "There were " . $bytesWritten . " bytes written to the text file.";
    }

    if (!fflush($file_handle)) {
        die("There was a problem outputting all the data to the text file.");
    }

    if (!fclose($file_handle)) { 
        die("There was a problem closing the text file."); 
    }

} else {

    die("No file to write data to.  Sorry.");

}

Что странно, так это то, что оператор echo показывает следующее:

В текстовый файл было записано 10330 байтов.

И все же, когда я проверяю размер текстового файла через FTP, он показывает, что он равен 0 КБ, а данные внутри файла фактически усекаются. Я не могу представить, что это связано с самим FTP-сервером, потому что он работает, если PHP размещен на машине, отличной от той, что находится в Rackspace Cloud.

** ОБНОВЛЕНИЕ ** Я поговорил с представителем Rackspace Cloud, который упомянул, что им требуется пассивный ftp, если вы собираетесь использовать ftp с их серверов. Я настроил удаленный сервер для обработки пассивных ftp-соединений и убедился, что пассивный ftp теперь работает на удаленном сервере через ftp-клиент OSX Transmit. Я добавил:

ftp_pasv($file_handle, true);

Сразу после оператора fopen (), но я получаю сообщение об ошибке PHP о том, что я не предоставил действительный ресурс для ftp_pasv (). Как я могу гарантировать, что соединение с ftp-сайтом, которое делает PHP, является PASV, а не АКТИВНЫМ, и по-прежнему использовать fwrite ()? Между прочим, я заметил, что машина с Windows сообщает, что файл, записываемый моим PHP-кодом, занимает 4096 байт на диске. Это никогда не выходит за рамки этой суммы. Это заставило меня изменить php-значение output_buffering на 65536 просто для устранения неполадок, но это тоже не устранило проблему. . .

** ОБНОВЛЕНИЕ ЧАСТИ DUEX **

Устранение неполадок на моем виртуальном сервере в продукте Rackspace Cloud Sites оказалось слишком сложным, поскольку они не предоставляют достаточных прав администратора.Я создал очень маленький облачный сервер на продукте Rackspace Cloud Server и настроил все до такой степени, что я все еще вижу ту же ошибку с fwrite (). Чтобы убедиться, что я могу записать файл с этого сервера на удаленный сервер, я использовал основные команды ftp в моей оболочке bash на облачном сервере. Все работало нормально. Итак, я предполагаю, что в php-реализации fwrite () есть ошибка, и что это, вероятно, связано с каким-то типом проблемы с регулированием данных. Когда я пишу на удаленный сервер из своей локальной среды, которая имеет медленный рост по сравнению с тем, что предлагается на сервере Rackspace Cloud, он работает нормально. Есть ли способ эффективно снизить скорость записи? Просто спрашиваю:)

** ОБНОВЛЕНИЕ ЧАСТЬ III *

Итак, я принял предложение @a грустного чувака и реализовал функцию, которая может помочь кому-то, кто пытается записать в новый файл и отправить его целиком через ftp:

function writeFileAndFTP($filename=null, $data=null, $node=null, $local_path=null, $remote_path=null)
{

    //  !Determin the path and the file to upload from the webserver
    $file = $local_path.'/'.$filename;


    //  !Open a new file to write to on the local machine
    if (!($file_handle = fopen($file, "wb", 0))) { 
        die("There was a problem opening ".$file." for writing!");
    }


    //  !Write the file to local disk
    if ($bytesWritten = fwrite($file_handle, $data) ) {
        //echo "There were " . $bytesWritten . " bytes written to " . $file;
    }

    //  !Close the file from writing
    if (!fclose($file_handle)) {
        die("There was a problem closing " . $file);
    }

    //  !Create connection to remote FTP server
    $ftp_cxn = ftp_connect($node['addr'], $node['ftp_port']) or die("Couldn't connect to the ftp server.");

    //  !Login to the remote server
    ftp_login($ftp_cxn, $node['user'], getPwd($node['ID'])) or die("Couldn't login to the ftp server.");

    //  !Set PASV or ACTIVE FTP
    ftp_pasv($ftp_cxn, true);


    //  !Upload the file
    if (!ftp_put($ftp_cxn, $remote_path.'/'.$filename, $file, FTP_ASCII)) {
        die("There was an issue ftp'ing the file to ".$node['addr'].$remote_path);  
    }

    //  !Close the ftp connection
    ftp_close($ftp_cxn);

}
7
задан ariestav 1 March 2012 в 21:35
поделиться