共享主机有固定的最大执行时间;我的管理php脚本超出了这个范围
我的客户是一个创业者,没有html知识。他有一个网站是在linux共享托管环境basic包上用PHP创建的。在他的网站上,他想用照片展示他以前的工作。但他抱怨说,他发现自己很难以管理员的身份登录,自己上传这些照片 -现在他让我为他写一些简单的东西,这样他的Dropbox帐户中的照片就可以上传到他的网站上。我说好, 我在这里创建了一个管理页面,我的客户可以选择要下载到他的站点的dropbox相册。 -我使用dropbox api for php查找他的相册。 -我制作了一个表单,其中列出了带有提交按钮的相册,这些按钮将在dropbox帐户上执行PostRequestParameter=文件路径的操作 以下是该请求的代码:共享主机有固定的最大执行时间;我的管理php脚本超出了这个范围,php,dropbox-api,execution-time,http-post,Php,Dropbox Api,Execution Time,Http Post,我的客户是一个创业者,没有html知识。他有一个网站是在linux共享托管环境basic包上用PHP创建的。在他的网站上,他想用照片展示他以前的工作。但他抱怨说,他发现自己很难以管理员的身份登录,自己上传这些照片 -现在他让我为他写一些简单的东西,这样他的Dropbox帐户中的照片就可以上传到他的网站上。我说好, 我在这里创建了一个管理页面,我的客户可以选择要下载到他的站点的dropbox相册。 -我使用dropbox api for php查找他的相册。 -我制作了一个表单,其中列出了带有提交
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'));
}
}
}
}
现在最好做什么??
-托管网站的服务台表示,他们无法更改最长执行时间的设置。因此,更改php.ini文件毫无意义
-单独上传每张照片
-切换到专用服务器意味着我拥有完全控制权?我不知道我的客户是否愿意每月额外支付125欧元您可以探索的路线是使用命令行脚本。命令行上的PHP脚本通常不受执行时间的限制。因此,您可以使用adminpage让客户端选择Dropbox相册。例如,您可以将这些选择存储在数据库中的某个位置。您的cronjob可以进行实际下载。准备就绪后,应再次从数据库中删除该条目,或将其标记为已下载。 然后,您还可以使用此数据库在管理页面中显示下载状态 编辑:
现在,我想了一下,问他为什么觉得上传很困难?也许他的问题有一个更简单的解决方案。我认为您应该重构您的逻辑,同时使用一些客户端逻辑。。。 您应该首先下载带有getMetadataWithChildren的远程文件夹的结构,并使用某种索引将其存储在磁盘上,即:为要下载的每个文件/目录分配一个唯一的id。此任务有望在提供商设置的最长执行时间限制内终止。。。 然后,您应该构建第二个脚本来下载真实数据,读取以前下载的索引,一次读取一个文件/dir。 脚本应捕获最大执行时间错误,以表示尚未完成其作业。。。大概是这样的: 文件:从dropbox.php下载数据 然后,您应该调用php脚本反复从dropbox下载数据,直到下载完成: 文件index.html:
注意:这段代码只是一个简单的尝试,旨在展示一个可能的解决方案,它包含一些伪代码,它还没有完成,当然,还没有经过测试…:-您可能还应该使用setInterval,而不是while!完成循环,在javascript代码中…您尝试过在脚本中设置吗?@JayBlanchard听起来好像没有。-托管网站的帮助台说他们无法更改最大执行时间的设置。因此,更改我的php.ini文件没有意义。@MonkeyZeus在脚本中设置最大执行时间会覆盖php.ini文件,并且只会影响设置该文件的脚本。您为允许更多执行时间所做的任何更改只会将问题推到幕后。一张专辑迟早会变得足够大,超过新的执行时间限制,你不可能永远把执行时间推高。您需要分析代码并找到优化代码的方法,以便在分配的时间内完成更多工作。@JayBlanchard最终用户aapbee很有可能完全禁用此功能ini_set。他已经有了一个管理模块,可以在其中创建/删除相册和插入新照片。这就是解决办法。但他希望他的dropbox与他在iOS手机上拍摄的新照片同步时,他的网站会自动更新。阅读完您的答案后,我将尝试使用Javascript Web WorkersPerfect客户端方法进行实际下载。很高兴我给了你一些灵感…:-
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]
<?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;
}
}
?>
<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>