PHP有一个奇怪的问题file_get_contents.
过去,file_get_contents无论返回的HTTP状态代码如何,在远程文件上都会返回该文件的文本.如果我点击API并且它发回状态为500的JSON错误信息,则file_get_contents给我JSON(没有迹象表明遇到了错误代码).
我刚刚建立了一个Ubuntu 10.04服务器,这是第一个拥有PHP 5.3的Ubuntu.当出现500错误时,PHP会抛出警告,而不是给我JSON.因此,我无法解析JSON并提供一个很好的错误消息.
很高兴PHP注意到远程文件中存在错误,但是如果出现500错误,我甚至需要 JSON(特别是!).似乎没有办法将其关闭.有没有遇到过这个?有小费吗?
无论如何我可以检查file_get_contents何时完成加载文件,所以我可以加载另一个文件,它会自动完成加载一个文件,然后进入下一个文件?
我正在使用 file_get_contents 函数来控制客户端,(例如http://ip:port/?light=on)
在浏览器中使用相应的命令时它可以工作,当我将相同的 url 与 file_get_contents 函数结合使用时,它不起作用。
当我使用wireshark 请求时,我注意到浏览器使用的是http/1.1,而file_get_contents 使用的是http/1.0。
我相信 http 的版本是我的代码不起作用的问题,
如何在 de file_get_contents 函数中更改此版本的 http?或解决它?
现在有点抓我的头了。
我正在尝试从远程 url 获取文件。我可以从本地文件中保存内容,但不能从远程文件中保存。
这有效:
file_put_contents(
'file1.xml',
file_get_contents('file2.xml')
);
Run Code Online (Sandbox Code Playgroud)
这不会:
file_put_contents(
'file1.xml',
file_get_contents('http://www.domain.com/xmlapi/search.aspx?query=places&lid=38')
);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,我的其他脚本在第一次尝试时运行正常,但现在没有人会访问远程 url。
我最近开始在 Heart Internet 上托管我的新 php 文件。我在其他服务器上有类似的脚本,完全没有问题。
这是我得到的错误:
警告:file_get_contents() [function.file-get-contents]: php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/sites/mydomain/myfile.php on line 5`
警告:file_get_contents(http://www.domain.com/xmlapi/search.aspx?query=places&lid=38)[function.file-get-contents]:无法打开流:php_network_getaddresses:getaddrinfo 失败:名称或服务不是在第 5 行的 /home/sites/mydomain/public_html/myfile.php 中已知`
allow_url_fopen 被设定为 On
不同的域
我有一些简单的尝试从一个文件写到另一个文件.
$content=file_get_contents("C:\Users\Borut\Desktop\sql_PW1\mm_ads (1).sql");
file_put_contents("C:\Users\Borut\Desktop\sql_PW1\New", $content);
Run Code Online (Sandbox Code Playgroud)
我读的文件大约是80M大,php中的内存限制是128M,但是我收到一个错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 80739522 bytes)
Run Code Online (Sandbox Code Playgroud)
所以即使我试图分配的内存实际上更小,内存也已耗尽?我可以通过增加内存限制来完成这项工作,但我想知道为什么它不能使用此限制.
在PHP中我想加载一个XML文件(作为文本文件)并在屏幕上显示其内容(作为文本).我在表单中有一个简单的XML
<root> <parent>Parent text. </parent></root>
Run Code Online (Sandbox Code Playgroud)
如果我使用
$myxmlfilecontent = file_get_contents('./myfile.xml');
echo $myfilecontent;
Run Code Online (Sandbox Code Playgroud)
仅打印节点"父"的内容,它只打印"父文本",而不是整个文件内容.
这两种获取文件内容的方式有什么区别?哪一种更好,更有效?我认为他们都获得了相同的结果,但我真的不知道哪种方法更好。
例如。
此代码使用输出缓冲来获取文件的内容:
ob_start();
include('foo/bar.tpl');
$output .= ob_get_contents();
ob_end_clean();
Run Code Online (Sandbox Code Playgroud)
此代码使用 file_get_contents 并获得相同的结果。
$output = file_get_contents('foo/bar.tpl');
Run Code Online (Sandbox Code Playgroud) 我通过composer安装了官方Twilio PHP API Librarie("twilio/sdk":"~3.12").
当我尝试使用测试凭据时使用API(例如发送短信)时,我收到错误:
警告:file_get_contents():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败,在..vendor/twilio/sdk/Services/Twilio/HttpStream.php第62行
如果我尝试使用curl在终端发送短信 - 一切正常.
如何在不编辑Twilio PHP API Librarie代码的情况下修复它?
这是我的代码。我正在使用 post 方法发布我的数据。
$post_body = file_get_contents('php://input');
if(getenv('REQUEST_METHOD') == 'POST'){
print_r( array( "3","3d"));
}
print_r($post_body);
Run Code Online (Sandbox Code Playgroud)
我正在使用 chrome 的邮递员来测试此代码,但它不打印发布数据,请参阅输出图像。
我做错了什么???
编辑
为了展示我如何解决我的问题,我添加了这张图片。
我file_get_contents用来获取远程定价(每天更新),用于substr仅保留我想要的部分(从输出中去除货币符号和其他数据并仅保留数字)并用于file_put_contents将其存储到我引用的缓存目录中到以后。
这就是我现在所拥有的:-
<?php
$cacheDirectory = $_SERVER['DOCUMENT_ROOT'] . '/cache/';
// Small Plan - US
$cachefile_SM_US = $cacheDirectory . 'SM_US.cache';
if(file_exists($cachefile_SM_US)) {
if(time() - filemtime($cachefile_SM_US) > 1600) {
// too old , re-fetch
$cache_SM_US = file_get_contents('https://remotedomain.com/?get=price&product=10¤cy=1');
$substr_SM_US = substr($cache_SM_US,17,2);
file_put_contents($cachefile_SM_US, $substr_SM_US);
} else {
// cache is still fresh
}
} else {
// no cache, create one
$cache_SM_US = file_get_contents('https://remotedomain.com/?get=price&product=10¤cy=1');
$substr_SM_US = substr($cache_SM_US,17,2);
file_put_contents($cachefile_SM_US, $substr_SM_US);
}
// Large Plan - US
$cachefile_LG_US = $cacheDirectory . …Run Code Online (Sandbox Code Playgroud)