Я пытаюсь записать значительный кусок данных в файл, который открывается через 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);
}