Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Node JS子进程中设置$u POST值_Php_Node.js_Amazon Web Services_Http Post_Child Process - Fatal编程技术网

Php 如何在Node JS子进程中设置$u POST值

Php 如何在Node JS子进程中设置$u POST值,php,node.js,amazon-web-services,http-post,child-process,Php,Node.js,Amazon Web Services,Http Post,Child Process,我在AWS Lambda上托管了我的Slim应用程序。为了让我的PHP应用程序正常工作,我遵循 在我尝试使用POST方法提交表单之前,我的应用程序运行良好。我的PHP无法从表单中获取值。当我转储$\u POST和文件时,获取内容('php://input“),两者都返回空值 在本教程中,Chris(作者)指出,此代码生成子进程并设置一组环境变量,PHP CGI将这些变量填充到$\u服务器超级全局中 var php = spawn('./php-cgi', ['function.php'], {

我在AWS Lambda上托管了我的Slim应用程序。为了让我的PHP应用程序正常工作,我遵循

在我尝试使用POST方法提交表单之前,我的应用程序运行良好。我的PHP无法从表单中获取值。当我转储$\u POST文件时,获取内容('php://input“),两者都返回空值

在本教程中,Chris(作者)指出,此代码生成子进程并设置一组环境变量,PHP CGI将这些变量填充到$\u服务器超级全局中

var php = spawn('./php-cgi', ['function.php'], {
  env: Object.assign({
      REDIRECT_STATUS: 200,
      REQUEST_METHOD: requestMethod,
      SCRIPT_FILENAME: 'function.php',
      SCRIPT_NAME: '/function.php',
      PATH_INFO: '/',
      SERVER_NAME: serverName,
      SERVER_PROTOCOL: 'HTTP/1.1',
      REQUEST_URI: requestUri
  }, headers)
});
我不熟悉子进程,因此我想问是否有一种方法可以填充$\u POSTsuperglobal?因为我认为POST数据存在于我的handler函数中的事件对象/变量中,这意味着(我认为)我的NodeJS包装器可以访问POST数据,但它没有将其传递给PHP CGI

exports.handler = function(event, context)
以下是我的NodeJS包装器的完整代码:

var spawn = require('child_process').spawn;

var parseHeaders, parseResponse, parseStatusLine;

parseResponse = function(responseString) {
  var headerLines, line, lines, parsedStatusLine, response;
  response = {};
  lines = responseString.split('\r\n');
  parsedStatusLine = parseStatusLine(lines.shift());
  response['protocolVersion'] = parsedStatusLine['protocol'];
  response['statusCode'] = parsedStatusLine['statusCode'];
  response['statusMessage'] = parsedStatusLine['statusMessage'];
  headerLines = [];
  while (lines.length > 0) {
    line = lines.shift();
    if (line === "") {
      break;
    }
    headerLines.push(line);
  }
  response['headers'] = parseHeaders(headerLines);
  response['body'] = lines.join('\r\n');
  return response;
};

parseHeaders = function(headerLines) {
  var headers, key, line, parts, _i, _len;
  headers = {};
  for (_i = 0, _len = headerLines.length; _i < _len; _i++) {
    line = headerLines[_i];
    parts = line.split(":");
    key = parts.shift();
    headers[key] = parts.join(":").trim();
  }
  return headers;
};

parseStatusLine = function(statusLine) {
  var parsed, parts;
  parts = statusLine.match(/^(.+) ([0-9]{3}) (.*)$/);
  parsed = {};
  if (parts !== null) {
    parsed['protocol'] = parts[1];
    parsed['statusCode'] = parts[2];
    parsed['statusMessage'] = parts[3];
  }
  return parsed;
};

exports.index = function(event, context) {

    // Sets some sane defaults here so that this function doesn't fail when it's not handling a HTTP request from
    // API Gateway.
    var requestMethod = event.httpMethod || 'GET';
    var serverName = event.headers ? event.headers.Host : '';
    var requestUri = event.path || '';
    var headers = {};

    // Convert all headers passed by API Gateway into the correct format for PHP CGI. This means converting a header
    // such as "X-Test" into "HTTP_X-TEST".
    if (event.headers) {
        Object.keys(event.headers).map(function (key) {
            headers['HTTP_' + key.toUpperCase()] = event.headers[key];
        });
    }

    // Spawn the PHP CGI process with a bunch of environment variables that describe the request.
    var php = spawn('./php-cgi', ['slim/public/index.php'], {
        env: Object.assign({
            REDIRECT_STATUS: 200,
            REQUEST_METHOD: requestMethod,
            SCRIPT_FILENAME: 'slim/public/index.php',
            SCRIPT_NAME: '/index.php',
            PATH_INFO: '/',
            SERVER_NAME: serverName,
            SERVER_PROTOCOL: 'HTTP/1.1',
            REQUEST_URI: requestUri
        }, headers)
    });

    // Listen for output on stdout, this is the HTTP response.
    var response = '';
    php.stdout.on('data', function(data) {
        response += data.toString('utf-8');
    });

    // When the process exists, we should have a complete HTTP response to send back to API Gateway.
    php.on('close', function(code) {
        // Parses a raw HTTP response into an object that we can manipulate into the required format.
        var parsedResponse = parseResponse(response);

        // Signals the end of the Lambda function, and passes the provided object back to API Gateway.
        context.succeed({
            statusCode: parsedResponse.statusCode || 200,
            headers: parsedResponse.headers,
            body: parsedResponse.body
        });
    });
};
var spawn=require('child_process')。spawn;
var parseHeaders、parseResponse、parseStatusLine;
parseResponse=函数(responseString){
变量标题行,行,行,解析状态行,响应;
响应={};
lines=responseString.split('\r\n');
parsedStatusLine=parseStatusLine(lines.shift());
响应['protocolVersion']=parsedStatusLine['protocol'];
响应['statusCode']=parsedStatusLine['statusCode'];
响应['statusMessage']=parsedStatusLine['statusMessage'];
车头线=[];
while(lines.length>0){
line=lines.shift();
如果(行==“”){
打破
}
车头线。推(线);
}
响应['headers']=parseHeaders(headerline);
响应['body']=lines.join('\r\n');
返回响应;
};
parseHeaders=函数(headerLines){
变量标题、键、行、部件、\u i、\u len;
标题={};
对于(_i=0,_len=headerLines.length;_i<_len;_i++){
直线=车头线[_i];
部分=行。拆分(“:”);
key=parts.shift();
headers[key]=parts.join(“:”).trim();
}
返回标题;
};
parseStatusLine=函数(statusLine){
var解析,部分;
parts=statusLine.match(/^(+)([0-9]{3})(.*)$/);
解析={};
如果(部件!==null){
解析的['protocol']=部分[1];
已解析['statusCode']=部分[2];
已解析['statusMessage']=部分[3];
}
返回解析;
};
exports.index=函数(事件、上下文){
//在此处设置一些正常的默认值,以便此函数在未处理来自的HTTP请求时不会失败
//API网关。
var requestMethod=event.httpMethod | |“GET”;
var serverName=event.headers?event.headers.Host:“”;
var requestUri=event.path | |“”;
var头={};
//将API网关传递的所有头转换为PHP CGI的正确格式。这意味着转换头
//如“X-Test”改为“HTTP_X-Test”。
if(event.headers){
Object.key(event.headers).map(function(key){
headers['HTTP_'+key.toUpperCase()]=event.headers[key];
});
}
//使用一组描述请求的环境变量生成PHP CGI进程。
var php=spawn('./php cgi',['slim/public/index.php']{
环境:Object.assign({
重定向_状态:200,
请求方法:请求方法,
脚本_文件名:“slim/public/index.php”,
脚本名称:'/index.php',
路径信息:“/”,
服务器名称:服务器名称,
服务器_协议:“HTTP/1.1”,
请求URI:requestUri
},标题)
});
//在标准输出上侦听输出,这是HTTP响应。
var响应=“”;
on('data',函数(data){
响应+=data.toString('utf-8');
});
//当进程存在时,我们应该有一个完整的HTTP响应发送回API网关。
php.on('close',函数(代码){
//将原始HTTP响应解析为可以操作为所需格式的对象。
var parsedResponse=parseResponse(响应);
//发出Lambda函数结束的信号,并将提供的对象传递回API网关。
成功({
statusCode:parsedResponse.statusCode | | 200,
headers:parsedResponse.headers,
body:parsedResponse.body
});
});
};

在某些情况下,有必要在环境中设置内容长度和/或内容类型,以便php cgi正确处理$POST
例如(其中postBody是类似“field1=value1&field2=value2”的字符串):

需要将post正文输入到子项的stdin中。
以下是一个异步示例:

var spawn = require('child_process').spawn; 
var phpProcess = spawn (php_cgi_path, [script_path], {'env': env})
phpProcess.stdin.write( postBody );

var outputBuffer = []; 
phpProcess.stdout.on('data', function(data) { 
    outputBuffer.push (data.toString()); 
}) 
phpProcess.stdout.on('end', function( ) { 
    var phpOutput = outputBuffer.join('') ; 
    // process php output
});

也可以以同步方式提供输入数据,例如:

var spawnSync = require('child_process').spawnSync; 
var phpProcessSync = spawnSync (php_cgi_path, [script_path], {'env': env, 'input': postBody})
var phpOutput = phpProcessSync.stdout.toString()
// process php output
同样,post数据与“env”分开输入

还可以修改脚本,以便它也填充$\u文件。
例如,可以使用Uint8Array(而不是字符串)来存储post body,然后将“CONTENT\u TYPE”设置为
request.headers['CONTENT-TYPE']

(例如,我们可以使用
“CONTENT-TYPE:multipart/form-data;boundary=----WebKitFormBoundarynGa8p8HMIQ8kWQLA”

然后使用
phpProcess.stdin.write(Buffer.from(postBody));

它将在$FILES变量中包含“tmp\u name”等。

如何
var\u dump(file\u get\u contents('php://input'));?我也试过了。我忘了在我的问题中包括这一点。它还返回了null。是否尝试将变量作为querystring传递
function.php?x=y
@OzgurGUL我认为密码不安全?但我可能已经找到了解决办法。我填充了$\u服务器超全局的一个元素。查询字符串元素。我在那里指定了event.body,以便访问后端中的值。但我不知道它是安全的还是有效的。
var spawnSync = require('child_process').spawnSync; 
var phpProcessSync = spawnSync (php_cgi_path, [script_path], {'env': env, 'input': postBody})
var phpOutput = phpProcessSync.stdout.toString()
// process php output