从更新csv文件中删除行

时间:2015-09-27 22:58:39

标签: php wamp fgetcsv fputcsv php-5.6

在我的wamp服务器中,我有一个脚本每秒更新一次csv文件。 我想删除csv文件中的行,我有这段代码(从这里:How To Delete The Top 100 Rows From a CSV File With PHP):

$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服务器!

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这不是你问的。但在我看来,你现有的方案是错误的。然后你正在寻找一个愚蠢的解决方案来解决它。您有多任务问题,这不是一个快速的过程。每次执行此操作时,您也可能会丢失几行。

正确的方法是让文件夹说 LOGS

然后输入名称为 YYYYMMDD.CSV 的文件。每天更改名称。并删除7天以上的任何内容。

答案 1 :(得分: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));
     

当我尝试运行上面的代码时,问题就出现了:

     

"未能打开流权限被拒绝"

此处有3个案例,您无法修改该文件。

  1. 文件已在使用中(由其他进程锁定)。
  2. 文件没有正确的权限(R / W)。或者文件不属于您正在使用的用户/组,必须使用php的情况(www-data)。
  3. 文件不存在。
  4. 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,以允许最大选择值作为内存限制。