【问题标题】:How to stop a curl while requesting or stop the running php script?如何在请求或停止正在运行的 php 脚本时停止 curl?
【发布时间】:2010-03-26 10:20:11
【问题描述】:

我使用 url 来请求远程 url,这些远程 url 有时可能会非常慢或只是慢下来。 在这种情况下,我的 php 脚本仍在等待响应,这使得 apache 不得不将许多请求留在内存中然后超载。 我需要一种方法来停止 curl 请求或在指定时间过去后停止运行 php 脚本。 我试过declare(),对curl没有意义。 有人知道怎么解决吗?

顺便说一句:CURLOPT_CONNECTTIMEOUT 和 CURLOPT_TIMEOUT 的作用是什么?

这里是代码示例:

function http($url, $method, $postfields = NULL) {
    $ci = curl_init();
    /* Curl settings */
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ci, CURLOPT_TIMEOUT, 5);
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, 0);

    switch ($method) {
    case 'POST':
        curl_setopt($ci, CURLOPT_POST, TRUE);
        if (!empty($postfields)) {
            curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
        }
        break;
    case 'DELETE':
        curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
        if (!empty($postfields)) {
            $url = "{$url}?{$postfields}";
        }
    }

    curl_setopt($ci, CURLOPT_URL, $url);
    $response = curl_exec($ci);
    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
    $this->last_api_call = $url;
    curl_close ($ci);
    return $response;
}

我将连接超时和超时设置为 5 秒,但它不起作用。 curl仍然需要很长时间才能完成请求,但是url如果在5s内没有响应,则表示它已关闭或网络状况不佳,应该停止它。

【问题讨论】:

  • 设置超时是常见的解决方案。 CURLOPT_TIMEOUT 有什么问题?如果您需要帮助,您可能需要添加一些代码和说明什么不起作用。

标签: php apache curl


【解决方案1】:

如果在指定时间后仍未建立连接,CURLOPT_CONNECTTIMEOUT 将停止请求

如果在指定时间后仍未收到完整的响应,CURLOPT_TIMEOUT 将停止请求

对我来说,有时我会遇到问题,它仍然不会自己超时,在这种情况下,你可以尝试这样的事情:

declare(ticks = 1);

function sig_handler($sig) {

 mysql_query("insert into log (event) values ('Timed out!')");
 die("Timed out!");

}

pcntl_signal(SIGALRM,"sig_handler");
// call sig_handler function after 30 seconds
pcntl_alarm(30);

// curl code here

【讨论】:

  • 我无法使用 pcntl 进行测试,服务器不支持它。还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2020-09-13
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2013-11-15
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多