Я пытаюсь записать значительный кусок данных в файл, который открывается через fopen () в php.Обертка протокола, которую я использую, - ftp, поэтому файл удален от сервера, на котором выполняется код php.Файл, в который я пишу, находится на сервере Windows.
Я проверил, что файл фактически создается моим php-кодом, но проблема в том, что данные в файле не являютсяexistant (0KB) или запись в файл прекращается преждевременно.Не уверен, почему это так.
Вот код, который я использую для обработки операции:
$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)Облако), это не удается.Это наводит меня на мысль, что это проблема, связанная с настройкой моего сервера в 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он показывает, что он равен 0K, а данные внутри файла на самом деле усекаются.Я не могу представить, что это связано с самим 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, а не ACTIVE и все еще использует fwrite ()?Между прочим, я заметил, что машина Windows сообщает, что файл, записываемый моим PHP-кодом, имеет размер 4096 байт на диске.Это никогда не выходит за пределы этой суммы.Это привело меня к изменению значения php output_buffering на 65536 только для устранения неполадок, но это также не решило проблему.,.
** ОБНОВЛЕНИЕ ЧАСТИ DUEX **
Устранение проблемы на моем виртуальном сервере в продукте Rackspace Cloud Sites оказалось слишком сложным, поскольку они не предоставляют достаточно прав администратора.Я создал очень маленький облачный сервер в продукте Rackspace Cloud Server и настроил все так, что я все еще вижу ту же ошибку с fwrite ().Чтобы убедиться, что я могу записать файл с этого сервера на удаленный сервер, я использовал базовые команды ftp в своей оболочке bash на облачном сервере.Работало нормально.Итак, я предполагаю, что в реализации php функции fwrite () есть ошибка, и это, вероятно, связано с тем или иным типом проблемы регулирования данных.Когда я пишу на удаленный сервер из своей локальной среды, скорость которого выше, чем у сервера Rackspace Cloud, он работает нормально.Есть ли способ эффективно снизить скорость записи?Просто спрашивайте:)
** ОБНОВЛЕНИЕ ЧАСТЬ III *
Итак, я взял предложение от @a sad dude и реализовал функцию, которая может помочь кому-то пытатьсязаписать в новый файл и отправить его полностью через 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);
}