替代 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_create
或fsockopen
。如果没有任何效果...更改您的托管服务提供商。
【讨论】:
【参考方案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 和 always_populate_raw_post_data 被禁用时,php://input 和 $HTTP_RAW_POST_DATA 的替代方案是啥