2016-12-20 16 views
8

스크립트가 끝나면 파일을 삭제할 수 있지만 실행 중에는 fclose() 이후에도 파일을 만질 수 없습니다.fclose 후에 PHP에서 파일의 링크를 해제 할 수 없습니다

$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'의 내용은 무엇입니까? 또한 읽기를 위해 "r"모드와 함께'fopen'을 사용하고 나중에 파일을 삭제하려고합니다. 사용자에게 삭제 권한이 있습니까? 어쩌면 허가 문제 일 수도 있습니다. 다른 코드없이'unlink'를 시도하십시오. –

+2

'unlink' 전에'@'를 제거하십시오. 그러면 PHP가 왜 실패했는지 알려줄 수 있습니다. 또한'fclose'의 반환 값을 확인하십시오. – chiliNUT

+0

@KodosJohnson 지금까지 도움을 주셔서 감사합니다. 나는'fopen '을 사용하지 않고'unlink'를 시도 할 것입니다. 예제에 더 많은 코드를 추가했습니다. 더 중요한 부분을 놓치지 않았 으면합니다. –

답변

5

내가 전에이 문제로 실행하고 파일을 닫은 후 가비지 수집을 강제로 해결 할 수 있었다과의 연결을 해제하기 전에했습니다 멀지 않은 최적의 솔루션으로

gc_collect_cycles(); 

을하지만,이 문제를 해결했다 나는 이전에 열렸던 파일들을 삭제하고 전에는 닫은 선들을 삭제했다.

+0

와우는 효과적이었고, 다른 곳에서는이 함수가'fclose()'이후에 실행될 수 있었지만, 딸꾹질, 그 덕분에 –

+0

캐시 ('clearstatcache') 지우기가 이런 종류의 오버런 문제를 도울 것이라고 생각하십니까? – Martin

+0

@BrianLeishman'gcl_collect_cycles' 해킹없이'fclose' 전에'fflush' 해 주시겠습니까? – bishop