Как я могу сохранить все результаты переменных из эха в текстовый файл, используя php - PullRequest
0 голосов
/ 02 августа 2020

Я написал сценарий php, который генерирует случайные токены, и я хочу вывести эти токены в файл .txt, вот код:

do {

$token = bin2hex(random_bytes(2));

echo("token: $token");

$myfile = fopen("output.txt", "w+") or die("Unable to open file!");
fwrite($myfile, $token);
fclose($myfile);

} while ($token != "e3b0");

он отображает несколько токенов, пока не появится эхо = e3b0, но когда я пытаюсь записать результат в текстовый файл, он пишет только «e3b0». Это способ записать все результаты «эха» в текстовый файл?

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

На мой взгляд, наиболее эффективный способ сделать это - сделать все необходимое количество раз. Это означает, что нам нужно l oop и сгенерировать коды, но нам нужно записать в файл только один раз, то же самое с эхом.

$code = "start value";
while ($code != "e3b0"){
    $arr[] = $code = bin2hex(random_bytes(2));
}

echo $str = implode("\n", $arr);
file_put_contents("output.txt", $str);

Это делает все достаточно раз, и еще оптимизированный код. Но если вы запустите это в браузере, он не будет выводить их в отдельных строках на экране, только в текстовом файле. Но если вы откроете исходный код, он будет в отдельных строках. Это потому, что я не использовал тег br при взрыве.

0 голосов
/ 02 августа 2020

Использование 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...