【问题标题】:Curl request not working on live server卷曲请求在实时服务器上不起作用
【发布时间】:2011-10-27 20:39:54
【问题描述】:

谁能告诉我为什么这个 CURL 代码只适用于我的本地服务器而不适用于实时服务器? 尝试了 3 种不同的主机,但没有任何效果。

在现场检查了所有内容 1) 卷曲启用 2)PHP版本可以 3) curl 执行没有任何错误但没有结果

已经 3 天了,我无法找到任何解决方案 请帮忙。

error_reporting(1);
set_time_limit(1500);

$fname=time().'_myfile.flv';
header('Content-type: video/x-flv');
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$fname\"");

define('USERAGENT', "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)");
$url='http://v3.lscache5.c.youtube.com/videoplayback?sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=914010%2C907605&algorithm=throttle-factor&itag=34&ip=112.0.0.0&burst=40&sver=3&signature=D51A660BDF83B54B3584425DBE8930D5D0F805E1.B3FB21D0CAF625D36A17B558A0A653F20788B49F&expire=1313503200&key=yt1&ipbits=8&factor=1.25&id=1cacd26a9913e4ec';


    $ch = curl_init() or die("Error");
    curl_setopt($ch, CURLOPT_USERAGENT, USERAGENT);
    curl_setopt($ch, CURLOPT_URL, $url);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  
    if(curl_exec($ch) === FALSE) 
    {
        die("Curl failed: " . curl_error($ch));  // Never goes here
    }

    curl_close($ch);

?>

【问题讨论】:

  • PHP 错误日志中有什么内容?
  • 否,Curl 执行成功,没有错误。
  • 也许您的服务器(或路由器)上的另一个软件阻止了该请求?

标签: php http curl download


【解决方案1】:

在 exec 之后执行 curl_getinfo($ch) 以查看服务器返回的响应代码。

【讨论】:

  • 是的,我收到了这个响应数组([url] => myURL [content_type] => text/plain [http_code] => 403 [header_size] => 204 [request_size] => 555 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.072783 [namelookup_time] => 0.059511 [connect_time] => 0.065592 [pretransfer_time] => 0.065616 [size_upload] => 0 [size_download] = > 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 0 [upload_content_length] => 0 [starttransfer_time] => 0.072781 [redirect_time] => 0 ) 1
  • 好吧:403 表示“禁止”:«服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求»。
  • 这段代码怎么能在本地主机上运行而不是在实时服务器上运行?
  • 我刚刚看到您的最新编辑。我想 YouTube 还没有禁止你的家庭 IP :-)
  • 还有一件事如果我尝试使用相同的 CURL 代码并尝试将响应保存在文件中,它在实时服务器上运行良好,但是当我创建 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);并提示用户保存文件,除了本地服务器之外它不会工作有什么解决方案吗?
【解决方案2】:

测试一下

error_reporting(E_ALL);

【讨论】:

    【解决方案3】:

    需要检查的一些事项:

    1. error_reporting() 的值很奇怪:1 equals E_ERROR 并暗示您几乎忽略了所有内容,包括警告。即使在生产中,我也不建议这样做,更不用说开发了。

    2. 您定义了$header_list,但从不使用它。

    3. 确保您检查的是真实输出,而不是浏览器呈现的输出。

    【讨论】:

    • 我已将错误报告更新为 error_reporting(E_ALL); $header_list 只是用于调试我知道它什么都不做。
    【解决方案4】:

    我有这个问题好几天了,无法在 PHP 中找到任何错误,并且 cURL 响应似乎完全返回为空。终于找到了建议的代码放入 cURL 请求中

    if (curl_exec($curl) === FALSE) {
       die("Curl Failed: " . curl_error($curl));
    } else {
       return curl_exec($curl);
    }
    

    添加这个最终在 PHP 中给了我一个错误:

    Curl Failed: SSL 证书问题,验证 CA 证书是否正常。 详细信息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

    在 SO 上搜索该错误给了我这个:HTTPS and SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, CA is OK

    这导致我将代码添加到我的 cURL 请求中,这实际上禁用了 SSL 验证。

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    

    我没有与我的服务器管理员一起工作以寻找更好的解决方案,因为我不知道这种解决方法是否很好,但现在它有效。

    【讨论】:

    • 这太棒了。
    • 谢谢♥ ....
    【解决方案5】:

    我相信它会帮助你(我已经独自解决了这个问题几天)

    将代理添加到您的 cURL:

    (当我们在数组中有 crul_opt 时的选项)

     CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100508 SeaMonkey/2.0.4',
    

    (单独设置 curl 时的选项)

    curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:7.0.1) Gecko/20100101 Firefox/7.0.1');
    

    我注意到它可以工作,因为邮递员给了我我不经意地粘贴到文件中的代码,尽管它不包括代理(对于 localhost 和邮递员它可以工作)并且实时托管不支持它。 (邮递员自己加了他的代理人)

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 1970-01-01
      • 2011-08-10
      • 2017-11-29
      • 2013-05-24
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多