Вопрос по thread-sleep, wait, php – заставить PHP ждать завершения функции?

4

Есть ли способ заставить PHP ждать, пока функция не вернется, прежде чем продолжить?

Это мой код:


Предполагается подождать, покаblahblah.txt изменения, подождите еще пять секунд после этого, затем распечатайтесделанный"однако распечатываетсделанный" через пять секунд, независимо от того, действительно ли файл изменился.

Соответствующая темаPhp обратные вызовы Martín Canaval
@ MartínCanaval, я пытался сделать это без обратных вызовов. markasoftware
Вы это отладили? добавлятьecho "$lfilemod\n" . filemtime($nof) . "\n"; послеwhile заявление. Ja͢ck
Очевидно файл изменился. В противном случае функция не вышла бы. webbiedave

Ваш Ответ

3   ответа
0

Попробуйте назначить вызов функции переменной. Я думаю, что это неиначе не дождусь возвращения.

0

Код выглядит хорошо; сохранить пропущенную точку с запятой (;) после строки waitforchange. Я протестировал размещение (;) там, и скрипт вел себя как задумано. Возможно, это виновник? Я затрудняюсь объяснить, как вы заставили свой код вообще выполняться с этой ошибкой.

Можно'т быть Тот код, который я ввел, не был скопирован из моего реального кода, он просто очень похож. Мой настоящий код имеет точку с запятой. markasoftware
Если точка с запятой не былат в самом сценарии, код не будетне бегать вообще. PHP сообщит об ошибке разбора, которая является фатальной ошибкой, которая может прервать выполнение сценария еще до его запуска. AgentConundrum
8

PHP является однопоточным, что означает, что он выполняет одну инструкцию за раз, прежде чем двигаться дальше. Другими словами, PHP, естественно, ожидает завершения функции, прежде чем продолжить выполнение следующего оператора.

Я попытался выполнить ваш код на моей машине, и он должным образом ждал и ждал, пока я не изменю файл, прежде чем завершить функцию и отобразить сообщение.

Я могу'даже не вижу в вашем коде ничего, что могло бы дать сбой. С момента создания$lfilemod выполняется так же, как проверка вwhile цикл, условие этого цикла будет возвращатьсяTRUE и выполнить, даже если была проблема с файлом (filemtime вернетсяFALSE на обеих ошибках, поэтому условие будет читать(FALSE == FALSEчто, очевидно,TRUE).

Изменяет ли ваш PHP-скрипт файл перед выполнением этого цикла? Если это так, то начальное значение возвращаетсяfilemtime может быть время модификации с момента первоначального запуска скрипта. Когда ты бежишьclearstatcache в цикле, выЯ выберу новое время модификации, вызванное вашими изменениями ранее в скрипте.

Мой совет:

Попробуйте запуститьclearstatcache перед установкой значения$lfilemod чтобы вы знали, что ценность чиста, и что высравнивая яблоки с яблоками с тем, что проверяется в цикле.

Убедитесь, что файл действительно нет быть измененным. Попробуйте разместить пару строк отладки в начале и конце вашего кода, который выводит время последнего изменения файла, а затем сравниваете их сами, чтобы увидеть, сообщает ли PHP об изменении времени изменения.

Это должно быть само собой разумеющимся, но вы должны убедиться, что PHP сконфигурирован для отображения всех ошибок во время разработки, чтобы вам сразу показали, когда и как что-то пойдет не так. Убедитесь, чтоdisplay_errors настройка повернутаOn в вашемphp.ini файл (или использоватьini_set() если ты можешь'изменить сам файл), и что вашerror_reporting() установлен вE_ALL | E_STRICT для PHP <= 5,3 илиE_ALL для PHP 5.4 (E_STRICT это частьE_ALL по состоянию на эту версию). Лучший способ - это просто установить в отчете об ошибках-1 который эффективно включает все сообщения об ошибках независимо от версии PHP.

Попробуйте запустить ваш код еще раз с этими изменениями. Если вы видите, что файл действительно изменяется, то вы знаете, что ваш код работает. Если файлне После внесения изменений у вас должна появиться ошибка, которую вы можете найти, или спросите нас здесь.

@Markasoftware Рад помочь! AgentConundrum
Спасибо! Файл был изменен после запуска сценария, но до вызова waitforchange (), поэтому я добавил clearstatcache () в начало waitforchange, и он работает! Мои также настройки php.ini были установлены неправильно. Это не былоПричина проблемы, но это может помочь в будущем. markasoftware
Как насчет записи файла? Я делю большой CSV-файл на несколько меньших версий, но мой код пытается открыть меньшие, прежде чем они будут созданы. Запись в файл не относится? Radmation

Похожие вопросы