Мой клиент является предпринимателем и не имеет знаний HTML. У него есть веб-сайт, который был создан с помощью PHP в среде общего хостинга Linux (базовый пакет). На своем сайте он хочет показать свои предыдущие работы с фотографиями. Но он жалуется, что ему трудно войти в систему как администратор и загружает эти фотографии сам.
-теперь он просит меня написать что-нибудь легкое для него, чтобы фотографии из его аккаунта Dropbox были загружены на его сайт. Я сказал хорошо 🙂
Я создал страницу администратора (Здесь мой клиент может выбрать, какой альбом Dropbox он хочет загрузить на свой сайт.)
-Я использовал API Dropbox для php, чтобы найти его фотоальбомы.
-Я создал форму, где я перечисляю те альбомы с кнопками отправки, которые будут выполнять POST-запрос (параметр = путь к файлу в учетной записи dropbox).
Вот код для этого запроса:
if (isset($_POST['AlbumAdd'])) {
$name = $_POST['AlbumAdd'];
//echo "submitted: $name <br>";
$entry = getClient()->getMetadataWithChildren($name); //dropbox-sdk
if ($entry['is_dir']) {
//for now create file on localhost -> replace with ftp to upload on shared hosting site
if (!file_exists(__DIR__ . "/../examples/folder" . $name)) { //if !excists create folder on localhost
mkdir(__DIR__ . "/../examples/folder" . $name, 0777, true);
//echo "created " . $name . "on localhost";
}
foreach ($entry['contents'] as $child) {
$cp = $child['path'];
$size = $child['size'];
$cn = basename($cp);
echo "basename (cn)= " . $cn . " [$size] <br>";
if (!$child['is_dir']) //files only
{
//download from dropbox to localhost
getClient()->getFile($cp, fopen(__DIR__ . '/../examples/folder' . $cp, 'w+b'));
}
}
}
}
Это прекрасно работает для небольших файлов, но выдает это исключение, когда альбом слишком велик:
Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\dropbox-sdk-php-1.1.4\dropbox-sdk\Dropbox\CurlStreamRelay.php on line 26
TEST OUTPUT:
basename (cn)= 01.mp3 [8.1 MB]
basename (cn)= 02.mp3 [7.3 MB]
basename (cn)= 03.mp3 [6 MB]
Что лучше всего делать сейчас?
-Helpdesk хостинг сайта говорит, что они не могут изменить настройку максимального времени выполнения. Так что нет смысла менять мой файл php.ini.
-загрузить каждую фотографию отдельно?
-переход на выделенный сервер означает, что я имею полный контроль? Я не знаю, любит ли мой клиент платить 125 € дополнительно / месяц
Я думаю, что вы должны реорганизовать свою логику, используя также некоторую логику на стороне клиента …
Сначала вы должны загрузить структуру удаленной папки (с помощью getMetadataWithChildren ()) и сохранить ее на диске с некоторой индексацией (т. Е. Назначить каждому файлу / директории для загрузки уникальный идентификатор). Надеемся, что эта задача будет завершена в течение максимального времени выполнения, установленного вашим провайдером …
Затем вы должны создать второй скрипт для загрузки реальных данных, считывая ранее загруженный индекс, по одному файлу / директории за раз.
Сценарий должен перехватить ошибку «MAXIMUM EXECUTION TIME», чтобы указать, что он еще не завершил свою работу … Примерно так:
Файл: «download_data_from_dropbox.php»
<?php
register_shutdown_function('shutdown');
global $id;
DOWNLOAD_DATA($id);
echo json_encode(array("done" => 1);
exit 0;
function shutdown() {
$e = error_get_last();
if ($e == "max_execution_time") {
echo json_encode(array("lastId" => $id);
exit 0;
}
}
?>
Затем вы должны вызвать php-скрипт для повторной загрузки данных из dropbox, пока он не завершится:
Файл «index.html»:
<html>
<head>
</head>
<body>
...
<div id="status"></div>
...
<script>
$(document).ready(function() {
var done = false, id = '',
while (!done) {
var url = "download_data_from_dropbox.php?id=" + id;
$.ajax({
url: url,
dataType: 'json',
}).done(function(response) {
if (response.done === 1) {
// php script is done
done = true;
}
$("#status").html("Downloading data, last file ID is " + response.lastId + " ...");
}).fail(function(jqXHR, textStatus) {
$("#mybox").html("Error while downloading data: " textStatus);
done = true;
});
}
});
</script>
</body>
</html>
Примечание: этот код представляет собой простую попытку показать возможное решение, он содержит некоторый псевдокод, он еще не закончен и, конечно, непроверенной… 🙂 Вы также должны, вероятно, использовать setInterval()
вместо while (!done)
цикл, в коде JavaScript …
Маршрут, который вы можете исследовать, — это использование сценария командной строки. PHP-скрипты в командной строке обычно не ограничены по времени выполнения. Таким образом, вы используете свою страницу администратора, чтобы позволить вашему клиенту выбрать альбом Dropbox. Вы храните эти варианты где-нибудь (например, в базе данных). Ваш cronjob может сделать фактическую загрузку. Когда он будет готов, он должен снова удалить запись из базы данных или пометить ее как загруженную.
Затем вы также можете использовать эту базу данных для отображения статуса загрузки на странице администратора.
РЕДАКТИРОВАТЬ:
Теперь, когда я думаю об этом немного больше, спросите его, почему он считает загрузку трудной? Возможно, есть гораздо более простое решение его проблемы.