У меня есть сценарий оболочки (rsync.sh) с командой rsync:
rsync -rtlv —password-file = / путь / к / паролю / файлу / file.txt —bwlimit = 5000 / local / root / path / $ 1 имя пользователя @ remoteserver :: remote / root / path / $ 2
Затем я запускаю это из PHP (rsync.php) с помощью команды exec:
exec (‘/ path / to / shell / script / rsync.sh локальный / определенный / путь / удаленный / определенный / путь /’, $ progress, $ errors);
Это все отлично работает. Я получаю прогресс, как только он закончен, и я анализирую его. До сих пор я тестировал только несколько небольших файлов. Однако, как только это будет запущено в производство, я ожидаю, что это будет сделано на нескольких больших файлах, на завершение которых уйдет более часа. Я хотел бы иметь возможность видеть прогресс, как это происходит. Если я поставлю там флаг —progress, я не уверен, как именно я получу прогресс через exec. Есть идеи?
Я думаю, что мне придется сделать exec асинхронным и каким-то образом отправить прогресс в базу данных, где он может быть собран и отображен.
Ты не можешь PHP exec()
Функция не возвращается, пока команда не завершится.
Это на самом деле не очень хорошая задача для PHP — веб-серверы, как правило, плохо справляются со сценариями PHP (и, следовательно, веб-запросами), выполнение которых занимает часы. Это, как говорится, вы сможете получить ближе к предполагаемому поведению, используя proc_open()
семейство функций, которые позволяют запускать процесс, который запускается параллельно с PHP-скриптом.
Других решений пока нет …