2012-12-10 2 views
0

를 입력합니다.변수 내용이 사라지고 루프 나던 내가 파일에서 읽고, 일부 계산 후 다시 쓸 수있는 다음 코드가

if(file_exists(CACHE_FILE_PATH)) { 
     //read the cache and delete that line! 
     $inp = array(); 
     $cache = fopen(CACHE_FILE_PATH, 'r'); 
     if($cache) { 
      while(!feof($cache)) { 
       $tmp = fgets($cache); 
       //some logic with $tmp 
        $inp[] = $tmp; 
      } 

      fclose($cache); 
     } 

     var_dump($inp); 

     $cache = fopen(CACHE_FILE_PATH, 'w'); 

     var_dump($inp); 
     if($cache) { 

      var_dump($inp); 

      foreach ($inp as $val) { 
       echo "\nIN THE LOOP"; 
       fwrite($val."\n"); 
      } 

      fclose($cache); 
     } 
    } 

var_dumps의 출력은 다음의 배열에도 불구하고, 그 루프에 가고 IN THE LOOP 인쇄되지

array(3) { 
    [0]=> 
    string(13) "bedupako|714 
" 
    [1]=> 
    string(16) "newBedupako|624 
" 
    [2]=> 
    string(19) "radioExtension|128 
" 
} 
array(3) { 
    [0]=> 
    string(13) "bedupako|714 
" 
    [1]=> 
    string(16) "newBedupako|624 
" 
    [2]=> 
    string(19) "radioExtension|128 
" 
} 
array(3) { 
    [0]=> 
    string(13) "bedupako|714 
" 
    [1]=> 
    string(16) "newBedupako|624 
" 
    [2]=> 
    string(19) "radioExtension|128 
" 
} 

! 왜?

+0

'$의 cache' 아마 TRUE ''로 평가하지 않습니다. 서로 다른 장소에서 3 개의'var_dump()'호출을하므로 코드의 어느 부분이 실행되는지 알 수 없습니다. – MrCode

+0

첫 번째 매개 변수가 파일 리소스이기 때문에'fwrite ($ val. "\ n");'는 놀랍지 않습니다. – Crisp

답변

3

코드의이 부분 :

fwrite($val."\n"); 

가되어야한다

fwrite($cache, $val); // the "\n" is only required if it was stripped off after fgets() 

fwrite()의 첫 번째 인수는 fopen()으로 열린 파일 기술자이어야합니다. 물론

, 당신은 당신이 발견 한 것입니다 개발 과정에서 error_reporting(-1)ini_set('display_errors', 'On')에 설정 한 경우이 즉시 :)

코멘트에 제안한 것처럼, 당신은을 읽을 수 file() 같은 구조를 사용하여 코드를 단순화하려고한다 전체 파일을 줄 배열에 넣은 다음 join()file_put_contents()을 사용하여 모든 것을 다시 작성하십시오.

그냥 키/값 쌍의 캐시를 원한다면, 이런 식으로 뭔가에 볼 수 있었다 : 그것은 읽고 당신보다 더 빨리 PHP 자체가 (많이 읽을 수있는 데이터 구조를 포함하는 파일을 작성

// to read, assuming the cache file exists 
$cache = include CACHE_FILE_PATH; 

// write back cache 
file_put_contents(CACHE_FILE_PATH, '<?php return ' . var_export($cache, true) . ';'); 

양철통).

+0

^-^어리석은 실수. 감사합니다 ... – footy

+1

하지만 대답은 꽤 제한되어 있습니다. 먼저 PHP의 하이 레벨 파일 기능을 살펴보아야합니다. 예를 들어 PHP 파일이나 INI 파일을 사용하여 쉽게 액세스 할 수있는 키 - 값 파일 기반 저장소를 만들 수 있습니다. 코드를 작게 유지하면 바보 같은 실수를 범할 수있는 곳이 많지 않습니다. '$의 INP = 파일 (CACHE_FILE_PATH)'및 사용 내파를 작성하기위한, 그것은 http://php.net/file에뿐만 아니라 설명 된 것 - 또한 충분히 http://php.net/var_export – hakre

+0

@hakre 페어 참조 추가 한 대안의 예. –