file_put_contents перестал работать

У меня есть PHP-код, который подключается к FTP-серверу, читает содержимое файла, вносит незначительные изменения, а затем переопределяет исходный файл.

это выглядит как:

$stream_context = stream_context_create(array('ftp' => array('overwrite' => true)));

$file_content = file_get_contents($ftp_file); // this line works
$file_content = str_replace('some content', 'another content', $file_content); // this also..
file_put_contents($ftp_file, $file_content, 0, $stream_context);  // this one doesn't :/

реальная проблема в том, что «file_put_contents» работал долгое время, но теперь это не так. то, что он делает сейчас, странно: он удаляет исходный файл с сервера.. также, если я изменяю его на что-то вроде:

file_put_contents($new_ftp_file, $file_content);

насколько я знаю, он должен создать новый файл и поместить в него содержимое, но он его вообще не создает.

служба хостинга, которую я использую, изменила версию PHP несколько дней назад. Я не помню, какая была предыдущая версия, но текущая: 5.2.17

Благодарность! :)

некоторые изменения

Я нашел этот фрагмент: http://www.php.net/manual/en/function.file-put-contents.php#86864 делает то же самое, что и "file_put_contents", но с foen, fwrite и fclose (я отправляю его пример из-за результатов..). его функции возвращают «false», если он не может «fopen» файл, или «байты», если это удалось. Я получил "false" :/ что означает, что он даже не мог сделать:

@fopen($filename, 'w');

хотя "file_get_contents" с тем же адресом файла работает.


чтение работает (но если взять $filename и использовать его самостоятельно на клиентском FTP - работает):

@fopen($filename, 'r');

«open base_dir» для моего хостинга (который выполняет действие) имеет значение false, но для целевого хостинга (который имеет целевой файл) установлено значение true.


У меня была идея сохранить новый контент в новом файле, поэтому я попробовал что-то вроде:

$f = @fopen($new_ftp_file, 'w'); //this one seems to work and connect
fwrite($f, $file_content); // this one seems to work either and returning the number of byes..
fclose($f);

проблема в том, что ни один из них не работает. Я вошел на FTP-адрес, используя те же учетные данные, что и мой сценарий, и я не нашел новый файл. Он вообще не создавался. (напомню, "$new_ftp_file" - это путь к несуществующему файлу, поэтому режим "w" на "fopen" должен создать его).


person David Levy    schedule 17.06.2014    source источник


Ответы (2)


file_put_contents удаляет файл по умолчанию, если он уже существует. Вы должны попросить его не делать этого. Посмотрите здесь: http://www.php.net/manual/en/function.file-put-contents.php См.: Если имя файла не существует, файл создается. В противном случае существующий файл перезаписывается, если только не установлен флаг FILE_APPEND.

person Valentin BEAULE    schedule 17.06.2014
comment
Я хочу, чтобы он заменил исходный файл, удалив его и поместив новый контент. проблема в том, что он удаляет оригинал, но не добавляет новый контент. - person David Levy; 17.06.2014
comment
Это может быть связано с тем, что вы потеряли некоторые права на своем сервере с предыдущим изменением. Убедитесь, что вы можете создавать/редактировать файлы в вашем каталоге. Также функция file_put_content работает с php5. ;) - person Valentin BEAULE; 17.06.2014
comment
$ftp_file представляет собой комбинацию другого ftp_hosting с использованием: ftp://[пользователь]:[пароль]@[file_address] — этот же адрес использовался для самостоятельного изменения целевого файла.. - person David Levy; 17.06.2014

это не лучшее решение (определенно), но мне удалось кое-что понять. Я использовал 2 разных хоста на одном и том же хостинге, оба из которых имели «open base_dir = On» и «safe mode = Off».

это выглядит примерно так:

$ftpstring = "ftp://user:[email protected]";
$file = file_get_contents($ftpstring . 'index.html'); // this line works as expected. (yeah, the other hosting has this file);

а затем, если вы пытаетесь написать что-то вроде:

$handler = fopen($ftpstring.'index.html', "w");

это не сработает и скажет вам, что не может получить доступ в режиме записи к существующему файлу. поэтому, если вы делаете что-то вроде:

$newfile_handler = fopen($ftpstring.'index_new_version.html', "w");
fwrite($newfile, "1122");

так что да - работает! но теперь это сложная проблема .. когда я добавляю эту строку:

fclose($newfile_handler);

новый файл удален с хостинга!!

Я не смог найти причину, по которой «fclose» удаляет файл после того, как он был создан в «fopen» и записан в «fwrite».

поэтому, если вы не добавляете строку «fclose» - она ​​работает, но не закрывает соединение, а также мне нужно фактически удалить существующий файл, прежде чем я смогу переопределить его новым содержимым, что делает его глупым. , хотя это работает, я бы очень хотел, чтобы кто-нибудь дал мне лучшее решение, чем мое.

person David Levy    schedule 17.06.2014