我正在建立一个允许用户上传图片的论坛。在移动到S3存储桶之前,图像将临时存储在我的Web服务器上(因此我可以使用进度条上传它们)。我没有想出这样做的好方法,但我认为以下内容是有道理的:
现在,由于步骤4可能需要相当长的时间,我正在寻找类似cron的解决方案,我可以在后台调用S3上传脚本,而不是让用户等待它完成。
理想情况下,我正在寻找一种解决方案,允许我在我的框架中请求URL 并在查询中传递一些图像ID,即:
http://mysite.com/utils/move-to-s3/?images=1,2,3
我可以将cURL用于此目的吗?或者如果它必须是exec(),我还能让它执行URL(wget?)而不是PHP脚本(php-cli)吗?
感谢一堆!
答案 0 :(得分:1)
PHP的
register_shutdown_function()
是你的朋友 [reference]。
当脚本终止时,关闭功能会继续运行。
因此,如果一切都可用,请提交结尾页面exit
。注册的关闭功能继续执行并执行耗时的工作。
就我而言,我准备了一个类CShutdownManager
,它允许注册几个在脚本终止后调用的方法。例如,我使用CShutdownManager
删除不再需要的临时文件。
答案 1 :(得分:0)
请尝试以下声明:
shell_exec(php scriptname);
答案 2 :(得分:0)
我找到了解决这个问题的方法,我很乐意与大家分享。我实际上是在SO上找到它,但它需要一些调整。这是:
解决方案需要exec()
或shell_exec()
。使用哪一个并不重要,因为无论如何都会丢弃所有输出。我选择了exec()
。
由于我使用的是MAMP,而不是系统级的PHP安装,我需要指向MAMP包中的PHP二进制文件。 (这实际上有所不同。)我决定在名为PHP_BIN
的常量中定义此路径,因此我可以为本地和实时环境设置不同的路径。在这种情况下:
define(PHP_BIN, '/Applications/MAMP/bin/php/php5.3.6/bin/php');
理想情况下,我想在我的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);
}
}
在this SO question中,我找到了在后台执行shell命令的方法。这是必要的,因为我不希望用户必须等到它完成。
最后,我运行这段PHP代码在后台执行其他(或任何)Web请求:
exec(PHP_BIN . ' /path/to/my_curl.php http://site.com/url/to/request
&> /dev/null &');
像魅力一样!希望这会有所帮助。