【问题标题】:CURL not working when used inside a function在函数内使用时 CURL 不起作用
【发布时间】:2013-03-28 18:00:28
【问题描述】:

我正在尝试使用以下代码执行 curl。

mainFunction{
  .
  .
  $url = strtolower($request->get('url', NULL));
  $html_output= $this->startURLCheck($url);
  .
  .
}

function startURLCheck($url)
{
 $ch = curl_init();
 curl_setopt($ch,CURLOPT_URL,$url);
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30);
 $html_output = curl_exec($ch);
}

当我直接给出字符串 URL 时,这工作正常。但是后来我通过一个函数 curl 没有执行字符串数据。 curl_error 也没有显示错误。我为字符串尝试了许多编码和解码方法,结果相同。我做错了吗?我在 Windows 上使用 XAMPP 服务器。

在从另一个函数的 HTML 发布请求中获取 URL 后,我将 URL 传递给该函数。

【问题讨论】:

  • $url 超出您的范围:php.net/manual/en/language.variables.scope.phpcurl_error() 将提供有关 curl 调用中出现问题的更多启发性信息
  • 你能添加你用来定义函数的语法吗?
  • 确保你的函数类似于 runCurl($url) { ... } 然后在你的代码中你可以执行 runCurl('foo/bar');
  • @Pekka : CURL_ERROR 没有显示任何消息或错误号
  • @ManojSreekumar 当您将http://www.google.com 作为来自另一个函数的 HTML 发布请求的 URL 变量传递时,它是否有效?

标签: php curl


【解决方案1】:

问题在于您的函数 startURLCheck 实际上并没有返回值供主程序使用。更改最后一行:

function startURLCheck($url)
{
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    return curl_exec($ch);
}

在你的调用代码中,取出“$this->”

$html_output = startURLCheck($url);

$html_output 现在包含 curl 调用的结果。

我假设您从某个地方复制并粘贴了这段代码,因为您的“mainFunction”声明在语法上不正确,并且您使用了“$this->”而没有指定 startURLCheck 是一个对象的方法。

如果实际上您希望 startURLCheck 成为一个对象方法,并且希望它在对象上设置 $html_output,请执行以下操作:

<?php

class Example {
    private $html_output;

    function mainFunction()
    { 
        $url='http://www.ebay.com/itm/Apple-iPhone-5-16GB-Black-Slate-Cricket-intl-UNLOCKED-pleeze-read-ad-/251252227033';
        $this->startURLCheck($url);
        echo "HTML output: " . $this->html_output;
    }

    function startURLCheck($url)
    {
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        $this->html_output = curl_exec($ch);
    }
}

$example = new Example();
$example->mainFunction();

我已经在命令行(不是在网页中)测试了这段代码。如果您将其复制并粘贴到文件中并使用 php -r 运行它,您将看到结果。 (请注意,我没有包含结束 ?> 标记。当文件仅包含 PHP 代码而没有 HTML 时,结束标记是可选的。事实上,在这种情况下建议省略结束标记。请参阅http://php.net/manual/en/language.basic-syntax.instruction-separation.php )

还请注意,在您的 mainFunction 问题代码中,您的 URL 中的“pleeeze”之前有非法空格,并且您在 $url 分配末尾缺少分号。

希望这会有所帮助。祝你好运。

【讨论】:

  • 我现在注意到的是,当我使用 print_r 打印 $html_output 时,它会打印“请稍候...重定向到 ' 和 url..但是当我在函数中对 URL 进行硬编码时打印html页面内容...我很抱歉代码不完整..我给出的也是我函数的一部分..稍后我正在使用正则表达式分析html_output并返回另一个输出..
【解决方案2】:

这很好用。

<?php
function excURL()
{
 $ch = curl_init();
 $url = "http://www.google.com";
 curl_setopt($ch,CURLOPT_URL,$url);
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30);
 $html_output = curl_exec($ch);
 echo $html_output;
}

excURL();

?>

【讨论】:

  • 是的,这也适用于我。但是我通过一个变量将 URL 传递给它不起作用的函数
【解决方案3】:

嘿伙计们,我找到了问题..终于..

当我为 curl 设置 CURLOPT_FOLLOWLOCATION 时,它工作正常......

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

但仍然不清楚为什么当我在函数中硬编码 URL 时它起作用,而当我将 url 作为变量传递给函数时它不起作用,而没有设置 CURLOPT_FOLLOWLOCATION ...当我设置此选项时,它正在工作两种方式..

【讨论】:

  • 很高兴你找到了它。如果您需要有关函数内部硬编码 URL 与作为参数传入的问题的帮助,我认为您可能需要包含更多涉及的代码。最好的办法是编写一个独立的测试用例,stackoverflow 上的其他人可以自己运行和测试。它不一定是您正在处理的确切代码,只是一个重现错误的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多