6

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

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

我在某处读到将 connect_timeout 设置为 1 会起作用,但这不会终止连接吗?

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

回到主要问题,有没有办法告诉 php 脚本在后台运行某个特定函数,并不管该函数的结果如何,都将响应传递给用户

谢谢

4

4 回答 4

5

我认为已经有其他帖子探讨了这些选项。鉴于您的限制,我看到了另外两种方法:

于 2013-06-20T11:49:27.040 回答
5
        function background_curl_request($url, $method, $post_parameters){
            if (is_array($post_parameters)){
                $params = "";
                foreach ($post_parameters as $key=>$value){
                    $params .= $key."=".urlencode($value).'&';
                }
                $params = rtrim($params, "&");
            } else {
                $params = $post_parameters;
            }
            $command = "/usr/bin/curl -X '".$method."' -d '".$params."' --url '".$url."' >> /dev/shm/request.log 2> /dev/null &";
            exec($command);
        }
于 2018-04-18T15:33:09.533 回答
4
  1. 从 php 发出简单的 curl 请求,如下所示或使用 javascript 进行 ajax 调用

    $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. 启动时使用 header 关闭 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
    

如果您需要更多的执行时间/内存,请相应地使用函数

于 2015-04-27T07:52:02.587 回答
3

我的经验是正确包装您的命令。

$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';

以上对我来说效果很好,只需要 3 毫秒,但以下不起作用,需要 1500 毫秒。

$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 进程,只需记住正确 WRAP 命令即可。

于 2016-12-29T08:07:03.383 回答