2 回答
TA贡献1777条经验 获得超10个赞
在我看来,最有效的方法就是每件事都做足够的次数。这意味着我们必须循环并生成代码,但我们只需要写入文件一次,与 echo 相同。
$code = "start value";
while ($code != "e3b0"){
$arr[] = $code = bin2hex(random_bytes(2));
}
echo $str = implode("\n", $arr);
file_put_contents("output.txt", $str);
这是所有事情都执行足够的次数,并且是更优化的代码。
但是,如果您在浏览器中运行它,那么它不会将它们输出到屏幕上的单独行上,而只会输出到 txt 文件中。但如果你打开源代码,它将位于不同的行上。
那是因为我在 implode 中没有使用 br 标签。
TA贡献1770条经验 获得超3个赞
在原始OP问题中从未询问过效率。正在编辑这篇文章以提高效率,即无需重新打开和关闭文件。
您的使用w+将始终将文件指针放置在文件的开头并在进程中截断文件。因此,您总是会得到最后写入的值。
从php.net开始fopen w+:
Open for reading and writing; place the file pointer at the beginning of the file
and truncate the file to zero length. If the file does not exist, attempt to create it.
使用您现有的代码,解决方案如下:
$myfile = fopen("output.txt", "a+") or die("无法打开文件!");
do {
$token = bin2hex(random_bytes(2));
echo("token: $token");
fwrite($myfile, $token);
} while ($token != "e3b0");
fclose($myfile);
a+在同一个文档中说:
Open for reading and writing; place the file pointer at the end of the file.
If the file does not exist, attempt to create it. In this mode, fseek()
only affects the reading position, writes are always appended.
来源: https: //www.php.net/manual/en/function.fopen.php
修正:
在循环内重复打开和关闭文件是不必要的(也不高效)。a+由于您正在追加,因此您可以在循环开始之前打开它一次;并在循环结束后关闭它。
就写入文件的标记之间的分隔符而言,回车符(换行符)是一个不错的选择。通过这种方式,您可以减少以编程方式读取文件时必须进行的解析量。为此,您的写入可以写成如下:
fwrite($myfile, $token . "\n");
- 2 回答
- 0 关注
- 155 浏览
添加回答
举报