PHP file_get_contents返回404 Not Found - 忽略错误

时间:2016-10-28 12:27:40

标签: php

我遇到了一个我不完全理解的奇怪问题。我的Web服务器通过PHP调用PHP api。其余的api会根据动词将请求路由到photos.php文件中的相应函数。 GET,PUT和DELETE请求都可以正常工作,但是下面的POST请求返回404 Not found。问题是它可以从浏览器或从Postman调用它时工作得很好。该文件绝对存在并具有适当的访问权限。我也没有遇到其他POST请求的问题。

经过大约5个小时的战斗并阅读了100个网站/文章后,我偶然发现了对#34; ignore_errors"的" stream_context_create选项的模糊引用。 =>真正。在我添加该行的那一刻,404消失了,我可以到达api端点。

我不明白这是怎么回事。该文件要么存在,要么就不存在,所以404就是谎言。我不想忽略错误以使其发挥作用。知道这里发生了什么吗?

    $apiUrl = 'http://localhost/api/v1/user/john/photos';

    // Setup http request
    $options = ["http" =>
        ["method" => "POST",
            "header" => "Content-Type: application/json",
            "ignore_errors" => true,
            "content" => $data
            ]
        ];
    // Call API
    $apiResponse = file_get_contents($apiUrl, NULL, stream_context_create($options));

以下是我收到的错误:

<b>Warning</b>: 
file_get_contents(http://localhost/api/v1/user/john/photos): failed to
open stream: HTTP request failed! HTTP/1.1 404 Not Found

卷曲信息:

Array
(
    [url] => http://localhost/api/v1/user/john/photos
    [content_type] => text/html; charset=UTF-8
    [http_code] => 404
    [header_size] => 214
    [request_size] => 147
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.015
    [namelookup_time] => 0
    [connect_time] => 0
    [pretransfer_time] => 0
    [size_upload] => 0
    [size_download] => 229
    [speed_download] => 15266
    [speed_upload] => 0
    [download_content_length] => 229
    [upload_content_length] => -1
    [starttransfer_time] => 0.015
    [redirect_time] => 0
    [redirect_url] => 
    [primary_ip] => 127.0.0.1
    [certinfo] => Array
        (
        )

    [primary_port] => 80
    [local_ip] => 127.0.0.1
    [local_port] => 53224
)
Header Info: HTTP/1.1 404 Not Found
Date: Fri, 28 Oct 2016 15:14:23 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
X-Powered-By: PHP/5.6.21
Content-Length: 229
Connection: close
Content-Type: text/html; charset=UTF-8

1 个答案:

答案 0 :(得分:0)

如果您正在寻找为什么file_get_contents在没有将ignore_errors设置为true的情况下抛出错误的答案,那么这些说明可能会让您更接近答案。请注意这些说明假设php错误日志尚未经过审核或尚无用,希望能帮助您解决这些问题。

  1. 要找到您的php错误日志,请将其放在脚本的顶部(暂时只对页面加载一次)

    <强>的phpinfo();模具();

  2. 现在,在该页面加载并且您看到您的php信息后,搜索 error_log 并在您的主机上找到该目录。

  3. 如果该值为空,则可能关闭了log_errors,或者错误正在打印到您的apache错误日志中。如果是这种情况,请尝试查找apache错误日志。

  4. 使用错误日志,替换 phpinfo(); die(); 这两个调用。关闭ignore_errors并再次运行该文件。

    <强>的error_reporting(E_ALL); ini_set(“display_errors”,1);

  5. 使用错误日志,您是否可以找到与file_get_contents调用相关的通知/警告/错误,如果他们没有解决问题,可以在此处发布?

  6. **编辑**

    好的,请使用curl,完整地获取响应和请求标题,并使用输出更新您的问题。

    ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    // ...
    
    $response = curl_exec($ch);
    
    // Then, after your curl_exec call:
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $header_size);
    $body = substr($response, $header_size);