2015-09-27 539 views
2

在我的wamp服務器中,我有一個每秒更新csv文件的腳本。 我想從CSV文件中刪除行,我有這樣的代碼(從這裏:How To Delete The Top 100 Rows From a CSV File With PHP):從更新csv文件中刪除行

$input = explode("\n", file_get_contents("file.csv")); 
foreach ($input as $line) { 
// process all lines. 
} 

// This function removes first 100 elements. 
// More info: 
// http://php.net/manual/en/function.array-slice.php 
$output = array_slice($input, 100); 
file_put_contents("out.csv", implode("\n", $output)); 

的問題發生了,當我試圖運行上面的代碼,我得到:

「未能打開流權限被拒絕「

問題是因爲文件一直在更新。 我如何知道? 我mada的csv的副本(該文件的內容沒有更新),它的成功。

爲什麼我需要這個?

因爲文件越來越大,我必須刪除他的行..如果我不這樣做,我會得到:「PHP致命錯誤:允許的內存大小********字節用盡(試圖在第54行的/var/www/*******.php中分配71個字節「,即使我寫入ini_set(」memory_limit「,」-1「);

我提醒你 - 這是wamp服務器!

有什麼想法?

謝謝!

+0

爲什麼你第一次寫信給csv? – PeeHaa

+0

一些重要的數據。因爲該文件正在增長,我必須刪除他的線..如果我不這樣做,我會得到:「PHP致命錯誤:允許的內存大小********字節用盡(試圖分配71個字節)在第578行的/var/www/*******.php中,「即使我寫入ini_set(」memory_limit「,」-1「); – jhon4

+0

你不能編輯更新文件的腳本並刪除那些額外的行嗎? –

回答

1

這不是你問的。但我認爲你現有的方案是有缺陷的。然後你正在尋找一個愚蠢的解決方案來解決它。你有多任務問題,這不是一個快速的過程。每當你這樣做時,你也可能會失去幾行。

要做到這一點的正確方法是有一個文件夾說日誌

然後把一個文件名爲YYYYMMDD.CSV。每天更改名稱。並刪除任何說,超過7天。

0
$input = explode("\n", file_get_contents("file.csv")); 
foreach ($input as $line) { 
// process all lines. 
} 

// This function removes first 100 elements. 
// More info: 
// http://php.net/manual/en/function.array-slice.php 
$output = array_slice($input, 100); 
file_put_contents("out.csv", implode("\n", $output)); 

The problem is happened when I trying to run the above code and I get:

"failed to open stream permission denied"

這裏有3種情況,你不能修改文件。

  1. 文件已被使用(被另一個進程鎖定)。
  2. 文件沒有正確的權限(R/W)。或者文件不屬於你正在使用的用戶/組,必須在php的情況下(www-data)。
  3. 文件不存在。

1)如果該文件已在使用,不能修改它,但你可以嘗試其他的東西*A RACE CONDITION*可以做到這一點:

# RACE CONDITION LOOP 
# The only way you have here is to setup a RC loop to check if/when the file can be written. 
$Path = dirname (__FILE__) . "path_to_your_file/out.csv"; 
$tries = 99; // Any number of tries you want. 
for ($i = 1; $i < $tries; $i++) 
{ 
    $output = array_slice ($input, 100); 
    { 
     if (@file_put_contents ($Path , implode ("\n", $output))) 
     { 
      echo "Content Added!"."<br>"; 
      $i = $tries; 
     } 
     else 
     { 
      echo "Content Cannot be Added!"."<br>"; 
     } 
    } 

    ob_flush (); 
    echo "We Have tried " . $i . " times to add content to the file"."<br>"; 
    sleep (1); 
    flush (); 
} 

2)如果文件沒有正確的權限,您可以將其設置在您的代碼中:

​​

3)如果文件不存在,你可以創建它,但首先一定要檢查它是否在那兒:

# Make sure the file that contain this code have the right permissions, user/group . 
# If not this cannot create the file and will not allow you execute the whole code . 
$Path = dirname (__FILE__) . "path_to_your_file/out.csv"; 
$Mode = 0755; // permissions wanted 
$Check_File = file_exists ($Path); 
if ($Check_File) { $File_Exist = true; } 
else { $File_Exist = false; } 

if ($File_Exist) 
{ 
    @touch ($Path); 
    @chmod ($Path, $Mode); 
} 
else 
{ 
    echo "File Already Exist"; 
} 

我希望這可以幫助,如果沒有請註明究竟是什麼問題。

PS:對於內存限制錯誤,某些服務器和/或主機提供程序不允許在用戶的php.ini或php中設置此值。你必須編輯php和apache的全局配置文件,或者在你使用大量數據庫的情況下編譯mysql的全局配置文件,以允許最大選擇的值限制內存。