如何在PHP后台运行cURL请求?

时间:2013-06-20 11:43:11

标签: php curl background

我正在尝试使用PHP和cURL扩展构建某种基于Web的下载管理器,但我遇到了一个问题,我如何使用cURL下载和保存文件而无需让用户等待,这意味着他将提出请求,并将在后台处理。

现在我不能使用系统调用(exec,system ...等),因为我使用的大多数主机都禁用了这些功能,而另一个问题是PHP脚本的最大执行时间,但我想这一个可以在.htaccess或使用ini_set中更改,还是不能?

我已经读过将connect_timeout设置为1的地方,但不会终止连接吗?

一个解决方案是使用cronjobs,在用户提交他想要下载的文件后,cronjob将检查数据库,如果队列中有文件,它将开始下载,但我想我想避免使用如果可能的话,cron就业。

回到主要问题,是否有办法告诉php脚本在后台运行某些特定功能并将响应传递给用户,而不管该功能的结果如何

由于

4 个答案:

答案 0 :(得分:5)

我认为已经有其他帖子在探索这些选项。鉴于您的约束,我看到另外两种方法:

答案 1 :(得分:2)

  1. 从下面的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
    
  2. 在启动时使用标头关闭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
    
  3. 如果您需要更多的执行时间/记忆,请相应地使用功能

答案 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>();