2013-06-20 19 views
2

我试图建立一种使用PHP和cURL扩展的基于web的下载管理器,但我仍然遇到了一个问题,我如何使用cURL下载和保存文件,而不必让用户等待,这意味着他将提出请求并在后台处理。如何在PHP的后台运行cURL请求?

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

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

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

所以回的主要问题,是有没有办法告诉PHP脚本在后台运行一些特定的功能,无论提供该功能的结果给用户的响应

感谢

回答

4

我认为还有其他职位已经探索过这些选项。鉴于你的约束,我看其他两种方法:

+0

我刚刚阅读了你发布的链接,这就是为什么我用粗体表示的问题,问题依然存在,这是否会终止连接?说我有一个大文件,我用cURL请求它,然后将超时设置为1,请求被终止?,再加上使用JS意味着vvisitor将不得不保持打开页面,直到下载完成为止?如果他们关闭该页面,下载将停止?我在这里讨论1 GB文件,所以它必须依赖于服务器,因为访问者不应该等待那么长时间,他们会排队文件并离开 –

+1

HTTP是一种无状态协议,即没有连接服务器会关心。它接收到一个请求并运行它应该执行的任何逻辑,直到完成为止,然后发送响应。客户是否仍然收到该响应并不重要。响应超时告诉客户端等待响应需要多长时间,但与服务器上发生的情况无关。 – joerx

+0

感谢您的链接:) –

2
  1. 使从PHP简单卷曲请求像下面或使用javascript

    $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. AJAX调用用头在出发
  3. 关闭HTTP连接,后来写PHP代码。如果你需要更多的exec时间/内存执行

    // 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 
    

,因此使用功能

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的过程,只记得妥善包装您的命令。