无法通过php file_get_contents

时间:2018-09-25 15:49:36

标签: php

这是个this question的事,我发现了更多信息,例如问题本身需要更改。

我正在尝试将数据从javascript SPA传递到一个php文件(dbPatch.php)到另一个php文件(mongoPatch_backend.php)。 dbPatch.php有效地充当了将数据获取到适当服务器的中间人。

我的javascript提取如下:

const API = PHP_FILE_LOCATION + 'dbPatch.php/';
const query = 
    "needleKey=" + encodeURIComponent(needleKey) + "&" +
    "needle=" + encodeURIComponent(needle) + "&" +
    "newData=" + encodeURIComponent(JSON.stringify(newData));

let URI = API;

fetch(URI, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: query
    }).then.... blah...blah....

这将调用我的php文件dbPatch ...

<?php
$API = "https://SERVER/php/mongoPatch_backend.php?";

$needleKey = $_REQUEST['needleKey'];
$needle = $_REQUEST['needle'];
$newData = $_REQUEST['newData'];

$postData = "needleKey=".urlencode($needleKey);
$postData .= "&needle=".urlencode($needle);
$postData .= "&newData=".urlencode($newData); //THIS IS THE LINE I TALK ABOUT BELOW

$data = file_get_contents($API.$postData);

echo $data;
?>

依次调用我的mongoPatch_backend.php文件...

<?php

$user = "xxx";
$pwd = 'xxx';

$needleKey = $_REQUEST['needleKey'];
$needle = $_REQUEST['needle'];
$filter = [$needleKey => $needle];
$newData = $_REQUEST['newData'];

$filter = ['x' => ['$gt' => 1]];
$options = [
    'projection' => ['_id' => 0],
    'sort' => ['x' => -1],
];

$bson = MongoDB\BSON\fromJSON($newData);
$value = MongoDB\BSON\toPHP($bson);

$manager = new MongoDB\Driver\Manager("mongodb://${user}:${pwd}@DBSERVER:27017");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    [$needleKey => $needle],
    ['$set' => $value],
    ['multi' => false, 'upsert' => true]
);

$results = $manager->executeBulkWrite('dbname.users', $bulk);

var_dump($results);
?>

这不起作用。

如果我直接从javascript调用mongoPatch_backend.php,它确实起作用。  这使我相信问题出在dbPatch.php文件中的数据传递。

此外,如果我使用不同的“ newData”(简称)调用dbPatch,则可以正常工作。这使我相信正在传递数据(但要记住,如果我直接调用它就可以了……所以它是从javascript出来的)。

通过var_dump($_REQUEST['newData']);从dbPatch.php中吐出$ newData,可以得到已经过字符串化但没有转义字符的JSON数据。大约有5,000个字符。

这是有趣的部分。

如果将mongoPatch_backend.php更改为<?php echo "Hello World"; ?>,我仍然不会通过dbPatch.php将任何内容传递回我的SPA。这确实使我认为dbPatch.php文件中有问题。

所以...我从dbPatch.php中注释了$postData .= "&newData=".urlencode($newData);行...我确实得到了“ Hello World”。

如果我只是删除.urlencode而只拥有$postData .= "&newData=".$newData;,我仍然什么也没回来。

所以问题似乎出在我的帖子中。 mongoPatch_backend.php甚至对$ newData都没有做任何事情... dbPatch.php(似乎)只是在发送该数据时遇到了麻烦。

不幸的是...我不确定从这里到哪里...鉴于,我确实确实需要将$ newData发送到后端。

编辑:响应于我使用“ POST”而不是“ GET”的建议,我进行了搜索,发现了这个堆叠问题:POST data to a URL in PHP

从那里,我现在有了这个:

dbPatch.php:

$url = 'https://SERVERNAME/php/mongoPatch_backend.php';

$myvars = 'myvar1=' . "TEST" . '&myvar2=' . "ALSOTEST";

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec( $ch );

echo $response;

然后我将mongoPatch_backend.php更改为:

<?php
echo "HELLO WORLD";
?>

...,我没有得到任何回应。 (也就是说,后端没有提供“ HELLO WORLD”)。

我的PHP日志没有显示错误。

我从phpinfo()开始的curl配置是:

cURL support    enabled
cURL Information    7.59.0
Age 4
Features
AsynchDNS   Yes
CharConv    No
Debug   No
GSS-Negotiate   No
IDN Yes
IPv6    Yes
krb4    No
Largefile   Yes
libz    Yes
NTLM    Yes
NTLMWB  No
SPNEGO  Yes
SSL Yes
SSPI    Yes
TLS-SRP No
HTTP2   Yes
GSSAPI  No
KERBEROS5   Yes
UNIX_SOCKETS    No
PSL No
Protocols   dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp
Host    x86_64-pc-win32
SSL Version OpenSSL/1.1.0h
ZLib Version    1.2.11
libSSH Version  libssh2/1.8.0

2 个答案:

答案 0 :(得分:1)

我不确定为什么,但是这个问题:PHP - CURL is enabled but not working使我举了一个使用cURL的示例。

我的dbPatch.php现在看起来像这样,似乎可以正常工作...

<?php
$url = 'https://SERVERNAME/php/mongoPatch_backend.php';

$params = 'needleKey=' . $_REQUEST['needleKey'] . '&needle=' . $_REQUEST['needle'] . '&newData='. $_REQUEST['newData'];

if (! function_exists ( 'curl_version' )) {
    exit ( "Enable cURL in PHP" );
}

$ch = curl_init ();
$timeout = 0; // 100; // set to zero for no timeout
$myHITurl = "http://152.61.248.218/php/mongoPatch_backend.php";
curl_setopt ( $ch, CURLOPT_URL, $myHITurl );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $params);
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
$file_contents = curl_exec ( $ch );
if (curl_errno ( $ch )) {
    echo curl_error ( $ch );
    curl_close ( $ch );
    exit ();
}
curl_close ( $ch );

echo "$file_contents";
?>

答案 1 :(得分:0)

file_get_contents仅用于将文件读取为字符串。可以将其视为在记事本或Textedit中打开文本文档。

对于动态渲染PHP文件的API请求,您将需要使用PHP库“ curl”

http://php.net/manual/en/book.curl.php

http://codular.com/curl-with-php