0

我一直在搜索并尝试很多来找到这个问题的答案,包括尝试对 StackOverflow 上提出的非常相似的问题的许多答案,正如我所读到的,这对许多用户来说效果很好,但对我来说却不是,原因我还不知道,但希望在这里找到答案。

我的问题是,由于某种原因,我无法从 PHP 中的 GoogleCode 页面中读取任何 Crypto-JS 的内容(例如http://crypto-js.googlecode.com/svn/tags/3.1。 2/build/rollups/sha512.js)。我从基本的开始file_get_contents,当失败时在网上搜索其他选项,这导致了以下基本类:

<?php
include 'snoopy.class.php';

class StreamReader {

    public static $agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)";
    static $proxy = "http://proxy.whoisaaronbrown.com/proxy/";

    public static function curlcontents($path) {
        if(!function_exists('curl_version')) { return false; }
        $handle = curl_init();
        if(!$handle) { return false; }
        $timeout = 30;

        curl_setopt($handle, CURLOPT_URL, $path);
        curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($handle, CURLOPT_VERBOSE, true);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($handle, CURLOPT_USERAGENT, StreamReader::$agent);

        $lines_string = curl_exec($handle);
        curl_close($handle);
        return $lines_string;
    }

    public static function sockcontents($path, $port = 80) {
        $handle = fsockopen($path, $port, $errno, $errstr, 30);
        if (!$handle) {
            echo " /* <b>$errstr ($errno)</b> */ "; return false;
        } else {
            $lines_string = "";
            $out = "GET / HTTP/1.1\r\n";
            $out .= "Host: $path\r\n";
            $out .= "Connection: Close\r\n\r\n";
            fwrite($handle, $out);
            $data = false;
            while (!feof($handle)) {
                $data = fgets($handle, 128);
                if($data === false) { break; }
                $lines_string .= $data;
            }
            fclose($handle);
            if($lines_string == "" && $data === false) { return false; }
            return $lines_string;
        }
    }

    public static function readcontents($path) {
        if(!ini_get('allow_url_fopen')) { return false; }

        // fopen opens webpage in Binary
        // $handle = fopen($path,"rb");
        $handle = fopen($path,"r");
        if(!$handle) { return false; }

        $lines_string = "";
        $data = fread($handle,1024);
        do {
            if($data === false || strlen($data) == 0) {
                break;
            }
            $lines_string .= $data;
            $data = fread($handle,1024);
        } while(true);

        fclose($handle);
        if($lines_string == "" && $data === false) { return false; }
        return $lines_string;
    }

    public static function browsecontents($path) {
        $snoopy = new Snoopy();
        if($snoopy->fetch($path)) { return $snoopy->results; }
        else { echo " /* <b>error fetching document: " . $snoopy->error . "</b> */ "; return false; }
    }
}
?>

如您所见,我将答案复制到“网站 - 如何在 PHP 中读取网页”“php - file_get_contents() 无法打开流”“php - 为什么 file_get_contents() 返回“无法打开流:HTTP 请求失败的!”?” “fsockopen - PHP 通过端口连接到外部 ip”和其他在 StackOverflow 上找到的可选解决方案,以及来自 SuperUser、PHP Freaks 和我在网上找到的其他解决方案。

(顺便说一句,由于我还没有足够的积分或其他东西,所以不允许我发布超过 2 个链接,因此感谢用户bmla对这篇文章进行去丑化

我的代码位于我无法控制的外部主机上,但function_exists('curl_version')返回 true,也ini_get('allow_url_fopen')确实如此,但http_get给出了未定义的函数错误。

我已经尝试了所有功能,以及相互结合以及与我发现或可以想到的其他技术,其中包括通过 Aaron Brown 的代理 ( $trythispathforachange = $proxy . $path;) 的重定向。可悲的是,我尝试过的所有功能和组合都会导致“连接失败”或“连接超时”错误,对于 Snoopy,它告诉我tcp://- 连接变坏了。另外,对于https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js ,一切都完美无缺,所以我认为到目前为止代码必须是正确的。

但显然对于 googlecode.com 而言,与任何基于人机界面的浏览器相比,仍有一些东西阻止它对我产生响应。

提前感谢您提供的任何帮助或信息!

克拉斯

4

0 回答 0