共享访问:如何修复 "fread(): Length parameter must be greater than 0"?
Shared access: How to fix "fread(): Length parameter must be greater than 0"?
当我运行这个函数在多个脚本上时一个脚本生成警告:
fread(): 长度参数必须大于0
function test($n){
echo "<h4>$n at ".time()."</h4>";
for ($i = 0; $i<50; $i++ ){
$fp = fopen("$n.txt", "r");
$s = fread($fp, filesize("$n.txt") );
fclose($fp);
$fp = fopen("$n.txt", "w");
$s = $_SERVER['HTTP_USER_AGENT'].' '.time();
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
fwrite($fp, $s);
// fflush($fp);// flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
}
}
我尝试为多个用户写读文件,但只有一个用户可以写文件。我知道当我将 fwrite 与 flock - LOC_EX 一起使用时,下一个脚本必须等到写入完成。但这里似乎 filesize 不会等到写操作完成。我的意见是它试图在文件大小为 0 时访问文件,结果这会产生问题:当文件由原始脚本写入时,将从文件中读取 0 字节。
是否可以为 fread 函数修复此问题?
这个脚本的目的是测试fread有一定的限制,并检查我后面读取的数据,如果我没有使用fflush时真的写入了数据。
function test($n){
echo "<h4>$n at ".time()."</h4>";
for ($i = 0; $i<50; $i++ ){
$start = microtime(true);
$fp = fopen("$n.txt", "r");
if(filesize($n.txt) > 0)
{
$s = fread($fp, filesize($n.txt) );
fclose($fp);
$fp = fopen("$n.txt", "w");
$s = $_SERVER['HTTP_USER_AGENT'].' '.time();
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
fwrite($fp, $s);
// fflush($fp);// flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
}
else
{
echo "Filesize must be greater than 0";
}
}
}
please change $s variables name its use same things two time
$fp = fopen("$n.txt", "r");
$s = fread($fp, filesize("$n.txt") );
fclose($fp);
错误出现在上面三行的中间一行
首先,这三行可以改写成一行如下:
$s = file_get_contents("$n.txt");
但是,这些不是必需的,因为这三行代码在您的代码中完全是多余的。他们没有做任何有用的事情。
他们所做的是打开一个文件,将其内容存储到 $s
,然后关闭它。
但是您随后立即将 $s
设置为不同的值,从而丢弃了先前的值,并且首先从文件中读取它变得毫无意义。
如果您需要保留文件的原始内容,请使用 file_get_contents()
并确保您不会覆盖变量的内容。
如果您不需要文件的原始内容,则只需从您的代码中删除这三行。
顺便说一下,这个错误强调了一些您应该采纳的良好编码实践:首先,永远不要将一个变量重复用于两个不同的事物,其次始终为您的变量(和函数)起一个好名字。 $s
不是一个好名字; $previousFileContents
会是一个更好的名字;它会使错误更加明显。
当我运行这个函数在多个脚本上时一个脚本生成警告: fread(): 长度参数必须大于0
function test($n){
echo "<h4>$n at ".time()."</h4>";
for ($i = 0; $i<50; $i++ ){
$fp = fopen("$n.txt", "r");
$s = fread($fp, filesize("$n.txt") );
fclose($fp);
$fp = fopen("$n.txt", "w");
$s = $_SERVER['HTTP_USER_AGENT'].' '.time();
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
fwrite($fp, $s);
// fflush($fp);// flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
}
}
我尝试为多个用户写读文件,但只有一个用户可以写文件。我知道当我将 fwrite 与 flock - LOC_EX 一起使用时,下一个脚本必须等到写入完成。但这里似乎 filesize 不会等到写操作完成。我的意见是它试图在文件大小为 0 时访问文件,结果这会产生问题:当文件由原始脚本写入时,将从文件中读取 0 字节。
是否可以为 fread 函数修复此问题?
这个脚本的目的是测试fread有一定的限制,并检查我后面读取的数据,如果我没有使用fflush时真的写入了数据。
function test($n){
echo "<h4>$n at ".time()."</h4>";
for ($i = 0; $i<50; $i++ ){
$start = microtime(true);
$fp = fopen("$n.txt", "r");
if(filesize($n.txt) > 0)
{
$s = fread($fp, filesize($n.txt) );
fclose($fp);
$fp = fopen("$n.txt", "w");
$s = $_SERVER['HTTP_USER_AGENT'].' '.time();
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
fwrite($fp, $s);
// fflush($fp);// flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
}
else
{
echo "Filesize must be greater than 0";
}
}
}
please change $s variables name its use same things two time
$fp = fopen("$n.txt", "r");
$s = fread($fp, filesize("$n.txt") );
fclose($fp);
错误出现在上面三行的中间一行
首先,这三行可以改写成一行如下:
$s = file_get_contents("$n.txt");
但是,这些不是必需的,因为这三行代码在您的代码中完全是多余的。他们没有做任何有用的事情。
他们所做的是打开一个文件,将其内容存储到 $s
,然后关闭它。
但是您随后立即将 $s
设置为不同的值,从而丢弃了先前的值,并且首先从文件中读取它变得毫无意义。
如果您需要保留文件的原始内容,请使用 file_get_contents()
并确保您不会覆盖变量的内容。
如果您不需要文件的原始内容,则只需从您的代码中删除这三行。
顺便说一下,这个错误强调了一些您应该采纳的良好编码实践:首先,永远不要将一个变量重复用于两个不同的事物,其次始终为您的变量(和函数)起一个好名字。 $s
不是一个好名字; $previousFileContents
会是一个更好的名字;它会使错误更加明显。