2015-01-08 3 views
-2

У меня есть следующий код:Почему эта функция возвращает false?

function lock() { 
    if($lock = @fopen('lock.txt', 'x')) { 
     fwrite($lock, getmypid()); 
     fclose($lock); 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

$response = lock(); 

Когда я запускаю код, файл lock.txt создаются и PID, помещаемый в файл. Однако функция возвращает false. Что происходит в мире?

  • мне нужно X для Еорепа, потому что я использую эту функцию для блокировки файлов и управления

  • Я взял @ прочь, и это ошибка, что я получил:

fopen (lock.txt): не удалось открыть поток: Файл существует в/xxx на линии 22.

Проблема в том, что я точно знаю, что файл не существует - я даже вернулся и удалил его, прежде чем запускал код. Код создает файл, но возвращает false.

Я проверил, чтобы другой файл не создавал файл. Я даже ждал 30 секунд, чтобы подождать и посмотреть, появился ли файл - он сам не появляется, он появляется только после выполнения этого кода.

+0

Вызывается ли это как раз один раз? –

+1

Снимите '@', вы получаете сообщение об ошибке? – Barmar

+0

Согласно [docs] (http://php.net/manual/en/function.fopen.php), 'fopen' с режимом' x' возвращает 'false', если файл уже существует. Вы уверены, что вносили в него изменения? Я почему-то сомневаюсь в этом ... –

ответ

3

В PHP Manual говорится, что для режима x:

Создать и открыть файл только для записи; поместите указатель файла в начало файла. Если файл уже существует, вызов fopen() завершится неудачей, возвратив FALSE и создав ошибку уровня E_WARNING. Если файл не существует, попытайтесь его создать. Это эквивалентно определению флагов O_EXCL | O_CREAT для базового открытого (2) системного вызова.

Функция возвращает ложь, потому что @fopen('lock.txt', 'x') возвращает ЛОЖЬ (файл уже существует), что приводит к $lock = @fopen('lock.txt', 'x') оценить ложь, запуская ветвь return false;.

+0

Удалите символ подавления ошибок '@' и запустите его снова. Это даст вам сообщение об ошибке. В то время как вы на нем, убедитесь, что сценарий выполняется в каталоге, который, по его мнению, (сценарий может жить в '/ data/script /', но запускаться в '/ run/other/directory'). – T0xicCode

+0

Этот файл создается между удалением и запуском скрипта. Убедитесь, что у вас нет другого кода, который мог бы записать этот файл. – T0xicCode

+0

Я также поместил весь путь к файлу, чтобы убедиться, что он не проверяет файл в другом каталоге - та же проблема. – user3210369

0

fopen() режим Xhttp://php.net/manual/en/function.fopen.php

Создание и открывает только для записи; поместите указатель файла на начало файла . Если файл уже существует, вызов fopen() завершится ошибкой, возвратив FALSE и создав ошибку уровня E_WARNING.

Если файл уже существует, вызов Еореп() закончится неудачей, вернёт FALSE и генерируется ошибка уровня E_WARNING.

Вы увидите предупреждение, если вы не используете @ подавление ошибок.

Возможно, вам нужен режим W.

Открыт только для письменного перевода; поместите указатель файла в начало файла и обрезайте файл до нулевой длины. Если файл не существует, попытается его создать.

+0

Мне нужно x, потому что я использую это как функцию блокировки файла в виде файла – user3210369

+0

Затем вам нужно будет удалить его перед вызовом 'lock()' еще раз. – AbraCadaver

+0

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

Смежные вопросы