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