jack-theripper / yandex

PHP SDK для работы с Яндекс Диском yandex disk
MIT License
127 stars 39 forks source link

Несколько последовательных операций #37

Open plyaskin opened 3 years ago

plyaskin commented 3 years ago
    $projectNumber = '1546';
    $projectPO = '5668884';
    $projectOldCategory = '1';
    $projectCategory = '2';

    $projectOldFolder = $disk->getResource($projectNumber.' - '.$projectPO.' - '.$projectOldCategory);
    $projectFolder = $disk->getResource($projectNumber.' - '.$projectPO.' - '.$projectCategory);
    $templateProject = $disk->getResource('!Templates/'.$projectCategory);

    foreach ($projectOldFolder->items as $item) { //remove all files in the folder with Category name
        if ($item['type'] == 'file' && str_contains($item['file'],$projectOldCategory))
            $item->delete();
    }
    $projectOldFolder->move($projectFolder,true);
    $templateProject->copy($projectFolder,true);

При переименовании/перемещении (move) скрипт перестаёт удалять/копировать, как бы не менял последовательности. Видимо, потому, что процедуры занимают больше времени, чем отработка скрипта и он уходит к следующей функции, как только получил ответ "true".

Возвращаемые значения TRUE или FALSE, а также Arhitector\Yandex\Disk\Operation в случае длительного копирования.

Возможно, решение в последнем, но как его использовать, ума не приложу, есть мысли?

jack-theripper commented 3 years ago

Стоит обратиться к документации api, https://yandex.ru/dev/disk/api/reference/move.html

Непустая папка может перемещаться в течение произвольного времени

Приложения должны самостоятельно следить за статусами запрошенных операций

Проверяйте статус, как сказано в документации о произвольном времени выполнения

if ($operation->getStatus() == Operation::SUCCESS) { ... }

или поменяйте логику приложения

plyaskin commented 3 years ago

Добавил в код echo $deleteFiles->getStatus();

    foreach ($projectOldFolder->items as $item) { //remove all files in the folder with Category name
        if ($item['type'] == 'file' && str_contains($item['file'],$projectOldCategory)) {
            $deleteFiles = $item->delete();
            echo $deleteFiles->getStatus();
        }
    }

Вообще ничего не возращает и каждый раз выпадает с ошибкой 500, либо, если удалять нечего, то просто пустой экран без ошибки. echo $deleteFiles->getStatus(); ставил везде, где только можно, и в цикле, и после. Это уже финальный вариант, пробовал как вы предложили с if, там так же безрезультатно (с getStatusCode тоже самое). Что не так?

jack-theripper commented 3 years ago

Ошибка 500? так включите вывод ошибок и используйте отладку.

Метод delete может возвращать как boolean, так и объект Operation. Если над ресурсом выполняется операция, то он "заблокирован" и api не сможет его переместить, например. Это не ошибка библиотеки, изучайте документацию. В документации описано, время выполнения может быть произвольным. И кстати, библиотека выбрасывает исключения когда яндекс диск возвращает ошибку, вам стоит их обрабатывать в try/catch