替代 file_get_contents?

Posted

技术标签:

【中文标题】替代 file_get_contents?【英文标题】:Alternative to file_get_contents? 【发布时间】:2011-04-28 03:29:58 【问题描述】:
$xml_file = file_get_contents(SITE_PATH . 'cms/data.php');

问题是服务器禁用了 URL 文件访问。我无法启用它,它是托管的东西。

所以问题是这样的。 data.php 文件生成 xml 代码。

如果不执行上述方法,如何执行并获取xml数据?

有可能吗?

【问题讨论】:

SITE_PATH 是您的网站的一部分吗?还是在别的地方? 它是我网站的一部分。 SITE_PATH = 'mydomain.com'; How to scrape websites when cURL and allow_url_fopen is disabled的可能重复 如果 mydomain.com 是运行代码的同一站点,则您不需要使用 http:// 请求来加载文件。事实上,这样做意味着您正在增加自己的带宽(http 请求和响应都将计入您的带宽总数的两倍)。即使您需要执行本地 PHP 程序并仅获取输出,也有其他不涉及使用 http 的方法来实现它。 你试过用 curl 代替吗? 【参考方案1】:

使用cURL。此函数是file_get_contents 的替代函数。

function url_get_contents ($Url) 
    if (!function_exists('curl_init')) 
        die('CURL is not installed!');
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;

【讨论】:

但我仍然收到“CURL 未安装!”但我启用了 php_curl 和 php_openssl 扩展 "CURL is not installed"表示需要安装cURL。现在这种情况很少见,大多数系统都默认安装了它。大多数基于 dpkg 的发行版都提供一个名为 php5_curl 的包,它带有正确的依赖项和配置指令。【参考方案2】:

你应该试试这样的, 我正在为我的项目做这个,它是一个后备系统

//function to get the remote data
function url_get_contents ($url) 
    if (function_exists('curl_exec')) 
        $conn = curl_init($url);
        curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($conn, CURLOPT_FRESH_CONNECT,  true);
        curl_setopt($conn, CURLOPT_RETURNTRANSFER, 1);
        $url_get_contents_data = (curl_exec($conn));
        curl_close($conn);
    elseif(function_exists('file_get_contents'))
        $url_get_contents_data = file_get_contents($url);
    elseif(function_exists('fopen') && function_exists('stream_get_contents'))
        $handle = fopen ($url, "r");
        $url_get_contents_data = stream_get_contents($handle);
    else
        $url_get_contents_data = false;
    
return $url_get_contents_data;
 

以后你可以这样做

$data = url_get_contents("http://www.google.com");
if($data)
//Do Something....

【讨论】:

【参考方案3】:

是的,如果您禁用了 URL 包装器,您应该使用套接字,或者更好的是 cURL 库。

如果它是您网站的一部分,请使用文件系统路径而不是 Web URL 来引用它。 /var/www/...,而不是http://domain.tld/...

【讨论】:

【参考方案4】:

如果您尝试读取从没有 file_get_contents() 的 URL 生成的 XML,那么您可能需要查看 cURL

【讨论】:

【参考方案5】:

如果文件是本地的,正如您对SITE_PATH 的评论所建议的那样,只需执行脚本并使用output control functions 将结果缓存在变量中即可:

function print_xml_data_file()

    include(XML_DATA_FILE_DIRECTORY . 'cms/data.php');


function get_xml_data()

    ob_start();
    print_xml_data_file();
    $xml_file = ob_get_contents();
    ob_end_clean();
    return $xml_file;

如果它像许多其他人所说的那样远程curl 是要走的路。如果它不存在,请尝试socket_createfsockopen。如果没有任何效果...更改您的托管服务提供商。

【讨论】:

【参考方案6】:

如果你有它,使用 curl 是你最好的选择。

您可以通过phpinfo() 并在页面中搜索 curl 来查看它是否已启用。

如果已启用,请尝试以下操作:

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, SITE_PATH . 'cms/data.php');
$xml_file = curl_exec($curl_handle);
curl_close($curl_handle);

【讨论】:

以上是关于替代 file_get_contents?的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008 中 percentile_cont 的替代方案

如何将file_get_contents转换为cURL

当 file_get_contents 和 always_populate_raw_post_data 被禁用时,php://input 和 $HTTP_RAW_POST_DATA 的替代方案是啥

file_get_contents HTTP 请求失败

从本地 LAMP 访问 SoapClient 和 file_get_contents

JSON 到 PHP 数组使用 file_get_contents