Что не так с порядком операций PHP? - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть основной скрипт, где я удаляю (отменяю связь) файл. Затем в некотором сценарии, который я включаю позже в этот основной сценарий, я записываю в этот файл (в файл с тем же именем, что и удаленный в любом случае, поскольку он уже должен быть удален).

Происходит следующее: после запуска основного скрипта файл удаляется. Так как операция unlink произошла после записи в файл. То же самое происходит, когда я обрезаю файл в основном скрипте (перезаписывая его пустой строкой), а затем записываю в этот файл. В результате файл пуст (как будто обрезание файла имело место после записи, но буквальный порядок в коде меняется на обратный).

Что здесь может быть не так? Или, если это не так, почему это так работает?

EDIT:

сначала (в основном скрипте):

 unlink($config['directory'].'logs/info.txt');

затем (в некоторых включается скрипт):

 $f = fopen($config['directory'].'logs/info.txt', "w");
 fwrite($f, "Text"); 
 fclose($f);

Я думал, что может быть какая-то распространенная ошибка, на которую вы могли бы указать (например, не вызывать fclose или что-то в этом роде). Поэтому, вероятно, мне нужно исследовать это ближе (но я уверен, что никакие другие операции с этим файлом не выполняются, потому что я использовал какое-то уникальное имя файла, и то же самое происходит).

Ответы [ 4 ]

2 голосов
/ 10 декабря 2010

Удалите .txt из параметра fopen - mode

$f = fopen($config['directory'].'logs/info.txt', "w");

http://php.net/manual/en/function.fopen.php

0 голосов
/ 10 декабря 2010

Просто мысль, а вы пробовали сбросить вывод?Вы можете использовать fflush($f);, чтобы заставить php записать все буферизованные данные в файл.

Конечно, вам это на самом деле не нужно - ведь открытие его с флагом 'w' в любом случае усекает файл.Вы уверены, что он открывается правильно?Может быть, попробовать что-то вроде этого:

$f = fopen($config['directory'].'logs/info.txt', "w");
if($f === false)die('File opening failed!');
fwrite($f, "Text"); 
fflush($f);
fclose($f);
0 голосов
/ 10 декабря 2010

Невозможно дать определенный ответ, фактически не видя код, но одна возможность состоит в том, что есть запрос ресурса от клиента, происходящий в фоновом режиме, который вызывает удаление файла после того, как основной запрос завершен.

Попробуйте использовать трассировки стека в той части скрипта, которая удаляет файл, чтобы определить, как он вызывается снова;см. debug_backtrace или debug_print_backtrace.

0 голосов
/ 10 декабря 2010

Как вы пишете в файл позже?file_put_contents () - это один из способов (и я больше ничего не использую), но если вы используете fopen / fwrite и забудете fclose, это может вызвать такие проблемы.

...