Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
共享主机有固定的最大执行时间;我的管理php脚本超出了这个范围_Php_Dropbox Api_Execution Time_Http Post - Fatal编程技术网

共享主机有固定的最大执行时间;我的管理php脚本超出了这个范围

共享主机有固定的最大执行时间;我的管理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查找他的相册。 -我制作了一个表单,其中列出了带有提交

我的客户是一个创业者,没有html知识。他有一个网站是在linux共享托管环境basic包上用PHP创建的。在他的网站上,他想用照片展示他以前的工作。但他抱怨说,他发现自己很难以管理员的身份登录,自己上传这些照片

-现在他让我为他写一些简单的东西,这样他的Dropbox帐户中的照片就可以上传到他的网站上。我说好,

我在这里创建了一个管理页面,我的客户可以选择要下载到他的站点的dropbox相册。 -我使用dropbox api for php查找他的相册。 -我制作了一个表单,其中列出了带有提交按钮的相册,这些按钮将在dropbox帐户上执行PostRequestParameter=文件路径的操作

以下是该请求的代码:

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>