2016-08-12 5 views
0

파일을 나중에 읽을 수 있도록 파일에 저장하는 기능을 만들었습니다.PHP로 파일에 쓰는 중 구문 오류가 있고 내용의 순서가 잘못되었습니다.

설명 된 방법은 here입니다.

$data = "<?php return ".var_export($var, true).";"; 
file_put_contents($filename, $data); 

이없는 파일에 변경을 요청 낮은있을 때 잘 작동하는 것 같다,하지만 동시에 여러 요청이있을 때 파일 내용은 구문 오류 또는 내용의 잘못된 주문으로 가득하고 때로는 비어 .

flock()을 사용한 후 file_get_conents(..)에 세 번째 인수 LOCK_EX와 fwrite()을 사용해 보았지만 같은 이상한 동작이 발생했습니다. 여기서 무슨 일이 일어나고 어떻게 해결할 수 있습니까?

+0

"다른 콘텐츠"를 찾으십니까? 무엇처럼? –

답변

0

여기서 문제는 부분 저장입니다. flock()을 사용하는 것은 자문 잠금을 설정하고 here과 같이 다른 프로세스에서 무시할 수 있기 때문에 도움이되지 않는 것처럼 보입니다.

부분 저장을 방지하는 유일한 방법은 데이터를 임시 파일에 먼저 쓰고 기존을 임시로 바꾸는 것입니다.

셸 명령을 사용하여 원본 파일을 이동하고 바꿔 문제를 해결했습니다.

$data = "<?php return ".var_export($var, true).";"; 
file_put_contents($filename, $data); 
exec("move tempfile ".$filename); // PHP copy()/rename() seemed to be affected by simultaneous requests. 

여기에 무슨 일이 일어나고 있는지 이해하지 못하는 사람들 :

다른 프로세스가 완료되기 전에 같은 파일을 읽고 어떤 프로세스가 데이터를 읽을 수있는 병렬로 실행하는 여러 프로세스가 동시에 수정

가이 글을 쓰는을 때로는 잘못된/불완전한 데이터가 파일에 저장됩니다.