Переименовывают () и unlink () асинхронные функции?

У меня есть веские основания полагать, что обе функции rename () и unlink () являются асинхронными, что, по моему мнению, означает, что при вызове функций код под ними продолжается до того, как он завершит свои процедуры в файловой системе. Это проблема для интернет-приложения, которое я объясню ниже, потому что более поздний код зависит от этих изменений, которые уже будут установлены на камне. Итак, есть ли способ сделать оба синхронных, чтобы считыватель кода зависал, когда он ударил эти функции, пока все его задачи не будут полностью выполнены в файловой системе?

Вот код в delete-image.php, который вызывается ajax из другого admin-images.php (последний не будет показан):

`

foreach ($dirScan as $key => $value) { $fileParts = explode('.', $dirScan[$key]); if (isset($fileParts[1])) { if ((!($fileParts[1] == "gif") && !($fileParts[1] == "jpg")) && (!($fileParts[1] == "png") && !($fileParts[1] == "jpg"))) { unset($dirScan[$key]); } } else { unset($dirScan[$key]); } } $dirScan = array_values($dirScan); // for thumbnail $file = 'galleries/' . $currentGal . '/' . $currentDir . "/" . $dirScan[$imageNum - 1]; unlink($file); for ($i = ($imageNum - 1) + 1; $i < count($dirScan); $i++) { $thisFile = 'galleries/' . $currentGal . '/' . $currentDir . '/' . $dirScan[$i]; $thisSplitFileName = explode('.', $dirScan[$i]); $newName = 'galleries/' . $currentGal . '/' . $currentDir . "/" . ($thisSplitFileName[0] - 1) . "." . $thisSplitFileName[1]; rename($thisFile, $newName); } // for large image $fileParts = explode('.', $dirScan[$imageNum - 1]); $file = 'galleries/' . $currentGal . '/' . $currentDir . "/large/" . $fileParts[0] . "Large." . $fileParts[1]; unlink($file); for ($i = ($imageNum - 1) + 1; $i < count($dirScan); $i++) { $thisSplitFileName = explode('.', $dirScan[$i]); $thisFile = 'galleries/' . $currentGal . '/' . $currentDir . '/large/' . $thisSplitFileName[0] . "Large." . $thisSplitFileName[1]; $newName = 'galleries/' . $currentGal . '/' . $currentDir . "/large/" . ($thisSplitFileName[0] - 1) . "Large." . $thisSplitFileName[1]; rename($thisFile, $newName); } sleep(1); echo 'deleted ' . $dirScan[$imageNum - 1] . " successfully!"; } else { echo "please set the post data"; } ?>` 

После того, как этот скрипт вернет завершенный текст, admin-images.php запускает новую функцию, которая заполняет таблицу изображений из этих переименованных и обрезанных файлов. Иногда он отображает старые имена и файлы, которые предположительно должны быть удалены, и простое обновление страницы избавляется от них. Это, по-видимому, предполагает, что вышеупомянутый PHP-скрипт работает через весь код и выплескивает эхо-текст в основной файл до того, как он завершит манипуляции с файловой системой (весь этот код длинный и сложный и, надеюсь, лишний для обсуждения под рукой ).

Вы заметите, я пробовал функцию sleep (), чтобы остановить скрипт php, чтобы надеяться, что это закончится. Это нецелесообразный и проблематичный способ делать что-то, потому что я должен уделять много времени, чтобы гарантировать, что он работает каждый раз, но я не хочу, чтобы пользователь подождал дольше, чем он / она должен.

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

    Я считаю, что проблема возникает из-за того, что при запуске scandir после внесения изменений он может использовать «кэшированные» данные из памяти вместо повторной проверки файловой системы.

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

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

    См. clearstatcache для очистки кеша clearstatcache PHP.

    Обратите внимание, что это проблема «просмотра», файл фактически удален на диске, но PHP все равно может вернуть его (пока вы не очистите кеш).

    rename() не является, но unlink() является асинхронным в Windows.

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

    Чтобы использовать любую операцию с файлами, вам необходимо использовать $ _SERVER ["DOCUMENT_ROOT"], чтобы сделать эту работу. Если вы этого не сделаете, настоящая операция не будет работать нормально. Также, если вы используете Linux Server, вам потребуется установить разрешения для папок, в которых вы хотите выполнить операцию файла.

    И помните, что обе операции синхронны, они не являются асинхронными. Это также зависит от типа сервера или операционной системы, которые вы используете.