【问题标题】:Get effective URL and it's status using cURL使用 cURL 获取有效 URL 及其状态
【发布时间】:2016-05-24 20:50:50
【问题描述】:

我编写了一个 PHP 脚本,它将循环大约。 500 个 URL 并检查它们的状态:

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch);

$destURL = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

echo $destURL . " - " . $statusCode;

是否可以进一步优化,或者有更好的方法吗?

【问题讨论】:

  • 看来您忘记了curl_exec( $ch )!另一种方法可能是使用curl_multi_exec,但问题是来自curl_multi_info_read 的响应不是很有用。 curl_multi_exec 允许并行处理 url,所以应该更快
  • @RamRaider 我在问题中添加了curl_exec($ch) 语句。本来就是这样的,只是忘了把它放在问题中。我也计划使用curl_multi_exec,但我不知道如何实现它,因为我需要最终有效的 URL 及其状态。
  • 我玩过 curl_multi...说 curl_multi_info_read 几乎没用了

标签: php curl cron


【解决方案1】:

您可以使用 GuzzleHttp 轻松做到这一点:

use GuzzleHttp\TransferStats;

$effectiveURL = '';
$statusCode   = 0;

$client = new GuzzleHttp\Client();
$client->get($url, [
    'on_stats' => function (TransferStats $stats) use (&$effectiveURL, &$statusCode) {

        $effectiveURL = (string) $stats->getEffectiveUri();
        if ($stats->hasResponse()) {
            $statusCode = $stats->getResponse()->getStatusCode();
        }

    },
]);

echo $effectiveURL . '<br>';
echo $statusCode;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多