2015-09-27 7 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)); 

Проблема произошло, когда я пытаюсь запустить приведенный выше код и я получаю:

" не удалось открыть разрешение на потоковое сообщение «

Проблема в том, что файл постоянно обновляется. Как я это знаю? I mada копия csv (содержимое этого файла не обновляется вообще), и это успех.

Зачем мне это нужно?

Поскольку файл растет, мне приходится удалять строки из него. Если я этого не делаю, я получаю: «PHP Неустранимая ошибка: Допустимый объем памяти из ******** байт исчерпан (пытался выделите 71 байт) в /var/www/*******.php в строке 54, «даже если я пишу ini_set (« memory_limit »,« -1 »);

Напоминаю вам, что это ваш сервер!

Любая идея?

Спасибо!

+0

Почему вы пишете csv каждую секунду в первую очередь? – PeeHaa

+0

Некоторые важные данные. потому что файл растет, мне приходится удалять строки из него. Если я этого не делаю, я получаю: «PHP Неустранимая ошибка: допустимый размер памяти из ******** байт исчерпан (пытался выделить 71 байт) в /var/www/*******.php в строке 578 ", даже если я пишу ini_set (" memory_limit "," -1 "); – jhon4

+0

Не можете ли вы отредактировать скрипт, который обновляет файл и удаляет лишние строки? –

ответ

1

Это не то, что вы просили. Но, на мой взгляд, ваша существующая схема неисправна. И тогда вы ищете глупое решение, чтобы исправить это. У вас проблемы с несколькими задачами, и это не быстрый процесс. Вы также, вероятно, потеряете несколько строк каждый раз, когда вы это сделаете.

Правильный способ сделать это - указать папку LOGS.

Затем введите файл с именем 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) Если файл не имеет права доступа вы можете установить его в вашем коде:

$Path = dirname (__FILE__) . "path_to_your_file/out.csv"; 
$Mode = 0755; // permissions wanted 
$Umsk = @umask(0); 
@chmod ($Path, $Mode); 
@umask ($Umsk); 

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, если вы используете большой объем данных для базы данных, чтобы максимально использовать значение предела памяти.

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

  • Нет связанных вопросов^_^