Как 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».
Почему второй файл ждет, не повторяя ничего, пока не закончится первый цикл?
Спасибо.
Поэтому для использования циклов 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;
}
Я надеюсь, что это прояснит что-то.
Других решений пока нет …