我正在尝试使用PHP和cURL扩展构建某种基于Web的下载管理器,但我遇到了一个问题,我如何使用cURL下载和保存文件而无需让用户等待,这意味着他将提出请求,并将在后台处理。
现在我不能使用系统调用(exec,system ...等),因为我使用的大多数主机都禁用了这些功能,而另一个问题是PHP脚本的最大执行时间,但我想这一个可以在.htaccess或使用ini_set中更改,还是不能?
我已经读过将connect_timeout设置为1的地方,但不会终止连接吗?
一个解决方案是使用cronjobs,在用户提交他想要下载的文件后,cronjob将检查数据库,如果队列中有文件,它将开始下载,但我想我想避免使用如果可能的话,cron就业。
回到主要问题,是否有办法告诉php脚本在后台运行某些特定功能并将响应传递给用户,而不管该功能的结果如何
由于
答案 0 :(得分:5)
我认为已经有其他帖子在探索这些选项。鉴于您的约束,我看到另外两种方法:
答案 1 :(得分:2)
从下面的php或使用javascript调用ajax调用简单的curl请求
$curl = curl_init('http://mutant-tech.com/execjob.php');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
echo $result; // should get - Closing Curl Request
在启动时使用标头关闭http连接,稍后编写php代码执行
// File - execjob.php START
ob_end_clean();
header("Connection: close");
ignore_user_abort();
ob_start();
echo ('Closing Curl Request');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
// BELOW YOUR BACKGROUND JOB/CODE
如果您需要更多的执行时间/记忆,请相应地使用功能
答案 2 :(得分:1)
我的经验是正确包装你的命令。
$time = microtime(true);
$command = '/usr/bin/curl -H \'Content-Type: application/json\' -d \'' . $curlPost . '\' --url \'' . $wholeUrl . '\' >> /dev/shm/request.log 2> /dev/null &';
exec($command);
echo (microtime(true) - $time) * 1000 . ' ms';
以上对我来说效果很好,只需要3ms,但是后续工作不会有效,需要1500ms。
$time = microtime(true);
$command = '/usr/bin/curl -H \'Content-Type: application/json\' -d \'' . $curlPost . '\' --url ' . $wholeUrl;
exec($command . ' >> /dev/shm/request.log 2> /dev/null &');
echo (microtime(true) - $time) * 1000 . ' ms';
总计添加“&> / dev / null&”在命令结束时可以使它在后台运行,不要挂起php和apache进程,只需记住正确地执行命令。
答案 3 :(得分:0)
private List<MyClass> data = new List<MyClass>();