从另一个脚本请求PHP脚本并继续

时间:2011-11-09 23:18:41

标签: php curl amazon-s3 exec

我正在建立一个允许用户上传图片的论坛。在移动到S3存储桶之前,图像将临时存储在我的Web服务器上(因此我可以使用进度条上传它们)。我没有想出这样做的好方法,但我认为以下内容是有道理的:

  1. 使用带进度条的XHR将图像上传到网络服务器
  2. 等待用户提交他的帖子
  3. 取消他最终未包含的图片
  4. 调用将剩余图片上传到S3的网址(完成后更新帖子正文中的图片网址)
  5. 将用户重定向到主题
  6. 中的帖子

    现在,由于步骤4可能需要相当长的时间,我正在寻找类似cron的解决方案,我可以在后台调用S3上传脚本,而不是让用户等待它完成。

    理想情况下,我正在寻找一种解决方案,允许我在我的框架中请求URL 并在查询中传递一些图像ID,即:

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

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

    感谢一堆!

3 个答案:

答案 0 :(得分:1)

PHP的

  register_shutdown_function()

是你的朋友 [reference]

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

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

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

答案 1 :(得分:0)

请尝试以下声明:

shell_exec(php scriptname);

答案 2 :(得分:0)

我找到了解决这个问题的方法,我很乐意与大家分享。我实际上是在SO上找到它,但它需要一些调整。这是:

  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代码在后台执行其他(或任何)Web请求:

    exec(PHP_BIN . ' /path/to/my_curl.php http://site.com/url/to/request
    &> /dev/null &');
    
  6. 像魅力一样!希望这会有所帮助。