【问题标题】:PHP file_get_contents not working on CentOSPHP file_get_contents 在 CentOS 上不起作用
【发布时间】:2020-03-22 15:52:20
【问题描述】:

我正在使用 file_get_contents 来抓取网页。代码非常简单,可以在 windows、mac 和几乎所有主要的基于 debian 的 linux 发行版上完美运行。在 CentOS 上,服务器发送 410 Gone 代替。

在 CentOS 7 64 位和 PHP 7.3 上运行

<?php

$x = file_get_contents('https://m.apkpure.com/facebook/com.facebook.katana/download'); 

echo $x;

在我的 MacOS 上

在 CentOS 7 上

两个操作系统都是最新的并且运行 PHP 7.3

【问题讨论】:

    标签: php web-scraping centos


    【解决方案1】:

    您收到此错误的原因是因为您在使用 https 时需要传递用户代理(标头),否则服务器将拒绝该请求。

    为了让事情变得更容易,最好使用 cURL,您可以查看以下功能是否解决了您的问题。它在你的 windows 和 mac 上工作的原因是因为服务器可能为请求分配了一个 header/useragent 而 linux 没有。

    在你的 linux 机器上解决这个问题的一种方法是在你的 php.ini 中启用 allow_url_fopen

    试试下面的功能。无需启用allow_url_fopen

     function scraper($url) {
          $ch = curl_init();
          curl_setopt($ch, CURLOPT_HEADER, 0);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($ch, CURLOPT_URL, $url);
          $data = curl_exec($ch);
          curl_close($ch);
          echo $data;
        }
    
        scraper("https://m.apkpure.com/facebook/com.facebook.katana/download");
    

    【讨论】:

    • 这没用,我第一次尝试。我认为这与函数名称无关,它是 centos 对这个特定站点的默认行为。你能通过测试来确认吗?
    • 我测试了我贴在上面的函数 scraper,在一个 debian 发行版上我遇到了和你一样的错误,并且 curl 的函数可以正常工作。
    • 检查你收到的源代码的标题是 401 页面兄弟。 file_get_contents 在状态码后停止,此代码也获取错误页面源,但不是实际页面。
    • 因为它会拉取 URL 的去向,“m.apkpure.com/facebook/com.facebook.katana/download”如果您在浏览器中访问此 URL,它会将您带到 410 - 页面已删除或已消失。因此,代码在解析该页面时可以正常工作。
    • 但 url 在任何 ubuntu 或 mac 甚至 windows 上都能正常响应,如原始问题中所述。 stackoverflow.com/q/54449110/2651080
    【解决方案2】:

    执行这个命令:

    sudo setsebool -P httpd_can_network_connect 1
    

    重启网络服务。

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 2013-06-30
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多