2016-12-20 3 views
8

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

$Files = glob("$_SERVER[DOCUMENT_ROOT]/files/*.csv"); 

    $File = fopen($Files[0], "r");   

    //while (($Data = fgetcsv($File)) !== false) {... 

    $i = 0; 
    while (is_resource($File)) { 
     $i && sleep(1); 
     echo "Closing handle.\n"; 
     fclose($File); 
     if (++$i > 5) 
      die("Could not close handle."); 
    } 

foreach ($Files as $File) { 
    $i = 0; 
    while (file_exists($File)) { 
     $i && sleep(1); 
     echo "Deleting file.\n"; 
     @unlink($File); 
     echo '[email protected]:~$ ', $Command = "rm -f '$File' 2>&1", "\n", shell_exec($Command); 
     if (++$i > 5) 
      die("Could not delete the file."); 
    } 
} 

Как вы можете видеть, что я не пытаюсь удалить его через unlink() и с помощью команд оболочки и ни работаю, оба даете мне эту ошибку:

rm: cannot remove 'invincible-file.csv': Text file busy

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

+4

Что такое содержимое '$ Files'? Кроме того, вы используете 'fopen' с режимом« r »для чтения, и вы пытаетесь удалить файл позже. Вы уверены, что пользователь имеет разрешение на удаление? Возможно, это вопрос разрешения. Попробуйте выполнить 'unlink' без какого-либо другого кода. –

+2

Удалите '@' перед 'unlink', чтобы вы могли позволить php рассказать вам, почему это не удалось. Также проверьте возвращаемое значение 'fclose'. – chiliNUT

+0

@KodosJohnson Спасибо, что помогли мне до сих пор, я собираюсь попробовать «unlink» без «fopen» вообще, и я добавил еще пример кода, надеюсь, что я не пропущу более важных частей –

ответ

5

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

gc_collect_cycles(); 

далеко не лучшим решением, но это действительно решить проблему Ранее я удалял файлы, ранее открытые и закрытые.

+0

Wow, который сработал, где бы я не мог найти эту функцию для запуска после 'fclose()', но это работало без икота, спасибо за то, что –

+0

считаете ли вы, что очистка кеша ('clearstatcache') будет способствовать такой проблеме переполнения? – Martin

+0

@BrianLeishman Не могли бы вы попробовать 'fflush' перед' fclose', без взлома 'gc_collect_cycles'? – bishop

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