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


PHP - fread() waiting until another fwrite() script ends

Update

正如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。但是,它应该回显一些东西,因为我检查文件是否能够被读取,否则回显"0"。

相反,我让第二个文件等待(显示为加载(,而不回显任何内容,直到第一个文件完成整个循环(所以我总是在第二个文件上以"9999"结束(。

我尝试更改fopen()模式,但没有运气,以及将fopen()fclose()置于循环之外。也没有运气。我还尝试使用file_get_contents()和其他功能更改fopen-fread-fclose的东西,但没有任何效果。

此外,fflush()ob_flush()flush()并没有产生任何影响。

正如我所说,文件被写入(如果我使用文本编辑器打开它,我会看到内容发生变化(,即使它不会,它也应该回显"0"。

为什么第二个文件要等待,而不回显任何内容,直到第一个循环结束?

谢谢。

因此,对于在 PHP 中使用 for 循环,您必须知道它会在循环中执行操作,直到 for 循环中的条件为假。因此,在第一次运行时将获取您的代码 forloop 将:

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

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

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

这又是真的。好吧,这种情况一直持续到 i = 9999。所以与此同时,它打开和关闭了文件 9999 次 en 在此文件中写入了通信号。正如您希望看到的那样,您的代码被锁定在该 forloop 处,并且不会比 forloop 被计算为 false 时更进一步。

你可以像现在一样让你 forloop 工作,但是当你关闭 for loop 中的文件时,你会从另一个文件调用一个方法,例如:

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;
}

我希望这能说明一些事情。

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

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设置,这个问题出来了。