PHP - fread()等待另一个fwrite()脚本结束

时间:2016-11-17 12:46:34

标签: php fopen freeze fwrite fread

更新

this.lau_所述,似乎问题是当第一个文件运行时,服务器上根本没有运行任何代码。我猜一些配置只允许一次运行一个脚本 - 或者每个用户只需一个脚本"。

现在我将研究在服务器上可能导致该行为的原因。谢谢大家的帮助!

原始问题

我在不同的文件上有两个PHP脚本:

/* The first file contains */
for($i = 0; $i < 10000; $i++){
    $w = fopen($progress_file, "w");
    fwrite($w, $i);
    fclose($w);
}

/* The second file contains */
$f = fopen($progress_file, "r");
$progress_read = fread($f, filesize($progress_file));
fclose($f);
echo $progress_read !== false ? $progress_read : 0;

正如你所看到的,我创建了一个循环,所以我有时间刷新第二个文件并等待它给出那个时刻写的数字。

我知道,在执行fopen($file, "w");时我会截断该文件,因此它不会给我(有时)给它应该给出的数字,它会给出0.但是,< strong>它应该回显,因为我检查文件是否能够被读取,否则,回显&#34; 0&#34;。

相反,我得到第二个文件等待(显示为加载),直到第一个文件完成整个循环时才回显任何东西(所以我总是以&#34; 9999&#34;在第二个文件上结束)。 / p>

我尝试在没有运气的情况下更改fopen()的模式,以及在循环外设置fopen()fclose()。也没有运气。我也尝试用file_get_contents()和其他函数改变fopen-fread-fclose的东西,但没有任何工作。

此外,fflush()ob_flush()flush()没有任何区别。

正如我所说,文件被写入(如果我用文本编辑器打开它,我看到内容发生了变化),即使它不会,也应该回复#34; 0&#34;。 / p>

在第一个循环结束之前,为什么第二个文件在没有回应的情况下等待?

谢谢。

2 个答案:

答案 0 :(得分:0)

因此,对于在PHP中使用for循环,你必须知道它将在循环中执行该操作,直到for循环中的条件为false。所以在第一次运行时把你的代码带到了forloop:

for(i=0; i<1000; i++){...}

这会返回true,因此它会进入forloop并执行您想要的所有内容。最后它将执行i ++ en将返回到for循环的评估,所以:

for(i=1 i<1000; i++){...}

这也是如此。好吧,这一直持续到i = 9999.所以同时它打开并关闭文件9999次在这个文件中写了对应号码。正如你所希望的那样,你的代码被锁定在forloop上并且不会继续比forloop被评估为false时更进一步。

你可以让这项工作让你像现在一样使用forloop,但当你在forloop中关闭文件时,你可以从另一个文件调用一个方法,如:

for($i = 0; $i < 10000; $i++){
    $w = fopen($progress_file, "w");
    fwrite($w, $i);
    fclose($w);
    doSomthingWithFile($filename);
}

另一方面:

doSomthingWithFile($filename){
    $f = fopen($filename, "r");
    $progress_read = fread($f, filesize($filename));
    fclose($f);
    echo $progress_read !== false ? $progress_read : 0;
}

我希望这能使事情变得清晰。

答案 1 :(得分:0)

第二个脚本不等待。您要么需要使用

file_put_contents($filename,$str,LOCK_EX);

强制文件等待,或者您需要延迟执行一些循环。

您可以在脚本的开头添加一个循环,以同时开始测试,如下所示:

echo "flock test ".time()."<br>";
$constant_time = 1570612500;
while ( time()<$constant_time )
{
usleep(500);
}

$ constant_time是您希望同时启动两个脚本的时间。给它以echo + 20秒显示的当前时间,然后将其上传到服务器上,然后运行脚本(您需要在时间过去之前执行此操作。这样,两个脚本将同时启动。

PS:我最初搜索的答案是,在设置LOC_EX并且出现此问题时,fread是否可以等待。