簡體   English   中英

PHP 在返回之前等待 curl 完成

[英]PHP waiting for curl to finish before returning

我有兩個 PHP 文件,一個用於“重載”,一個用於快速響應,將請求編組到重載器,以便快速響應文件可以立即響應服務器請求(至少,這是目標)。 這樣做的前提是 Slack Slash 命令更喜歡即時 200 讓用戶知道命令正在運行。

<?php
echo("I want this text to reply to server instantly");
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$code = '200';

$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => "http://myheavyliftingfile.php",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "datatobeusedbyheavylifter:data",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache",
    "content-type: application/x-www-form-urlencoded",
    "postman-token: 60757c65-a11e-e524-e909-4bfa3a2845fb"
  ),
));

$response = curl_exec($curl);
?>

似乎正在發生的事情是,我的響應/回聲在我的 Heavylifting.php curl 完成之前不會被發送到 Slack,即使我希望我的響應立即發生,而重型過程本身是分開的。 如何讓一個 PHP 文件確認請求,啟動另一個文件上的另一個進程,並在不等待漫長進程完成的情況下做出響應?

更新

我不希望一次運行多個 curl,我只想執行一個 curl 但不等待它返回以便向 Slack 返回一條消息,說我收到了請求。 我的 curl 將數據發送到我的另一個 php 文件,該文件執行繁重的工作。 如果這仍然是重復中定義的相同問題,請隨時再次標記它,我不會重新打開。

這不起作用的原因是,PHP curl 調用始終是同步的,並且您的超時設置為 30 秒,這遠遠超過了最大值。 Slash 命令允許的 3 秒。

但是有一個修復方法可以使這項工作正常進行。 你只需要這些小的改變:

  1. 將 curl 超時設置為較小的值以確保您的第一個腳本在 3 秒閾值以下完成,例如將CURLOPT_TIMEOUT_MS為 400,這定義了 400 毫秒的超時。

  2. 在您的第一個腳本中將CURLOPT_NOSIGNAL為 1。 這是超時在基於 UNIX 的系統中工作所必需的。

  3. 確保在您的第一個腳本中忽略超時錯誤(CURL ERROR 28),因為您的 curl 應始終返回超時錯誤。

  4. 通過添加以下行,確保您的第二個腳本不會因強制超時而中止: ignore_user_abort(true);

另請參閱此答案以獲取完整示例。

PS:對於這種方法,您不需要任何緩沖區刷新。

暫無
暫無

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

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