簡體   English   中英

如何在PHP后台運行cURL請求?

[英]How do I run cURL request in the background in PHP?

我正在嘗試使用PHP和cURL擴展構建某種基於Web的下載管理器,但我遇到了一個問題,我怎么能用cURL下載和保存文件而不必讓用戶等待,這意味着他會做請求,它將在后台處理。

現在我不能使用系統調用(exec,system ...等),因為我使用的大多數主機都禁用了這些功能,而另一個問題是PHP腳本的最大執行時間,但我想這個可以更改在.htaccess或使用ini_set或不是嗎?

我已經讀過將connect_timeout設置為1的地方,但是不會終止連接嗎?

一個解決方案是使用cronjobs,在用戶提交他想要下載的文件后,cronjob將檢查數據庫,如果隊列中有文件,它將開始下載它,但我想我想避免使用cron作業,如果可能。

那么回到主要問題,有沒有辦法告訴php腳本在后台運行某些特定功能並將響應傳遞給用戶,而不管該功能的結果如何

謝謝

我認為已經有其他帖子在探索這些選項。 鑒於您的限制,我看到另外兩種方法:

  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 

如果您需要更多的執行時間/內存,請相應地使用功能

我的經驗是正確包裝你的命令。

$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進程,只需記住正確地執行命令即可。

        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);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM