在我的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服务器!
有什么想法吗?
谢谢!
答案 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)如果该文件已在使用中,您无法对其进行修改,但您可以尝试使用其他内容*
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,以允许最大选择值作为内存限制。