2011-11-09 125 views
1

我正在构建一个论坛,允许用户上传图片。在移动到S3存储桶之前,图像将临时存储在我的Web服务器上(这样我可以使用进度条上载它们)。我还没有想出这样一个绝佳的方法,但是我觉得有以下有道理:从另一个脚本请求一个PHP脚本,并移动

  1. 上传图像(S)使用XHR与进度条
  2. 等待用户提交Web服务器他发布
  3. 取消链接图片,他最终没有包括在他的岗位
  4. 调用(完成后,并在后期体更新图像的URL),它会将剩余的影像而S3一个URL
  5. 重定向用户到他在主题

现在,因为第4步可能需要相当长的时间,我正在寻找一个像解决方案,我可以在后台调用S3上传脚本,并没有让用户等待为它完成。

理想情况下,我正在寻找一个解决方案,允许我请求我的框架内的URL 并通过一些图片ID的查询,即:

http://mysite.com/utils/move-to-s3/?images=1,2,3 

我可以使用卷曲此目的?或者,如果它必须是exec(),我还可以让它执行URL(wget?)而不是PHP脚本(php-cli)吗?

谢谢你!

回答

0

我找到了解决这个问题,我很高兴与大家分享。我真的发现它,但它需要一些调整。这里所说:

  1. 的解决方案需要既exec()shell_exec()。你使用哪一个并不重要,因为所有的输出都会被丢弃。我选择了exec()

  2. 因为我使用的是MAMP,而不是系统级的PHP安装,所以我需要指向MAMP包内的PHP二进制文件。(这实际上有所不同。)我决定在一个名为PHP_BIN的常量中定义此路径,以便为本地环境和实况环境设置不同的路径。在这种情况下:

    define(PHP_BIN, '/Applications/MAMP/bin/php/php5.3.6/bin/php');

  3. 理想情况下,我想执行我的web框架,而不是一些孤立的shell脚本里面的脚本。我写了接受一个URL作为参数包装脚本,并把它命名为my_curl.php

    if(isset($argv[1])) 
    { 
        $url = $argv[1]; 
    
        if(preg_match('/^http(s)?:\/\//', $url)) 
        { 
         $ch = curl_init(); 
         curl_setopt($ch, CURLOPT_URL, $url); 
         curl_setopt($ch, CURLOPT_HEADER, 0); 
         curl_exec($ch); 
         curl_close($ch); 
        } 
    } 
    
  4. this SO question我发现在后台执行shell命令的方式。这是必要的,因为我不希望用户必须等到它完成。

  5. 最后,我跑的PHP代码,此位执行其它(或ANY)Web请求在后台:

    exec(PHP_BIN . ' /path/to/my_curl.php http://site.com/url/to/request 
    &> /dev/null &'); 
    

就像一个魅力!希望这可以帮助。

1

PHP的

register_shutdown_function() 

是你的朋友 [reference]

当脚本终止时,关闭功能继续运行。

因此,如果一切都可用,请提交结局页面和exit。注册的关机功能继续并执行耗时的工作。

就我而言,我准备了一个类CShutdownManager,它允许注册脚本终止后调用的几种方法。例如,我使用CShutdownManager来删除不再需要的临时文件。

+0

从来没有听说过,但它听起来像*完全*我需要:)谢谢! – oscaralexander

+0

很少有人曾经使用过这种方法。还有更多有趣的东西要发现;-)不要忘记投票并接受答案...... – SteAp

+0

哦,我似乎在手册中找不到,但是:如果我打电话给标题重定向而不是退出?如上所述,我需要在处理他的帖子后将用户重定向到主题页面。 – oscaralexander

0

试试下面的语句:

shell_exec(php scriptname);