fopen — fread () ожидает завершения другого скрипта fwrite ()

Обновить

Как 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() вне петли. Не повезло ни Я также попытался изменить fopen-fread-fclose с помощью file_get_contents() и другие функции и ничего не сработало.

Также, fflush(), ob_flush() а также flush() не имеет никакого значения.

Как я уже сказал, файл записывается (если я открываю его в текстовом редакторе, я вижу изменения содержимого), и даже если этого не произойдет, он должен отображать «0».

Почему второй файл ждет, не повторяя ничего, пока не закончится первый цикл?

Спасибо.

1

Решение

Поэтому для использования циклов for в PHP вы должны знать, что он будет работать в цикле до тех пор, пока условие в цикле for не станет ложным. Итак, взяв ваш код, forloop при первом запуске take:

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

И это возвращает true, поэтому он входит в forloop и выполняет все, что вы хотите. В конце он выполнит i ++ en вернется к оценке цикла for так:

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

и снова это правда. Ну, это продолжается до тех пор, пока я = 9999. Таким образом, в то же время он открыл и закрыл файл 9999 раз и записал номер корреспонденции в этом файле. Как вы надеетесь, вы можете видеть, что ваш код заблокирован на этом forloop и не будет продолжать идти дальше, чем когда forloop оценивается как false.

Вы можете сделать эту работу, если вы делаете forloop таким же, как сейчас, но когда вы закрываете файл в forloop, вы вызываете метод из другого файла, например:

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

Я надеюсь, что это прояснит что-то.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]