Использование w+
всегда будет помещать указатель файла в начало файла и усекать файл в процессе. Таким образом, вы всегда получаете последнее записанное значение.
From php.net
on 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.
Используя существующий код , тогда решение будет следующим:
do {
$token = bin2hex(random_bytes(2));
echo("token: $token");
$myfile = fopen("output.txt", "a+") or die("Unable to open file!");
fwrite($myfile, $token);
fclose($myfile);
} while ($token != "e3b0");
Где 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
Поправки:
Как упоминает @andreas, многократное открытие и закрытие файла внутри l oop не является необходимым (и неэффективным). Поскольку вы добавляете, вы можете открыть его один раз с помощью a+
до того, как начнется l oop; и закройте его после того, как l oop закончится.
С точки зрения наличия символа-разделителя между токенами, записанными в файл, возврат каретки (разрыв строки) - хороший выбор. Таким образом вы можете уменьшить объем синтаксического анализа, который вам придется программировать при программном чтении файла. Для этого ваши записи могут быть записаны следующим образом:
fwrite($myfile, $token . "\n");