【问题标题】:php interpreter and superglobalsphp 解释器和超全局变量
【发布时间】:2011-08-03 00:15:34
【问题描述】:

首先,我是一名法国学生,请原谅我的英语不好 级别。

我们目前正在开发 Web 服务器 (C++),我必须开发 CGI 执行 部分,更准确地说:PHP CGI 部分。

当用户在我们的服务器上请求一个 .php 页面时,我们 fork/pipe 并调用 /usr/bin/php 口译员。例如:

$ /usr/bin/php index.php

现在,我们可以将结果保存在缓冲区中(生成的 index.php 的 html 代码),我可以发送 将此内容发送给客户端。它适用于没有任何变量的简单脚本。

然而,很多 php 脚本使用一些超全局变量,例如 $_GET 和 $_POST。 我的问题是:我怎样才能给 php 解释器这个参数?

示例:如何设置此 $_POST 变量以将“Hello world”保存在 我们的缓冲区?

<?php

echo $_POST['text'];

?>

感谢您以后的回复。

亲切

【问题讨论】:

标签: php arguments superglobals


【解决方案1】:

CGI 程序需要 stdin 上的 POST 数据。并在QUERY_STRING 环境变量中获取数据。

【讨论】:

    【解决方案2】:

    你必须设置一些环境变量:

    • REQUEST_METHOD=POST 告诉 PHP 它需要处理一个 POST 请求
    • CONTENT_LENGTH=1234 告诉 PHP 它将接收多少字节作为原始 POST 数据(在本例中为 1234 字节)
    • HTTP_CONTENT_LENGTHCONTENT_LENGTH基本相同。最好也设置它,以便它可以更好地与各种 PHP 版本/配置一起使用。
    • CONTENT_TYPE=application/x-www-form-urlencoded 是 HTTP Content-Type 标头

    您可以从 HTTP 标头中获得这些变量的正确值。

    您还需要一个通往 PHP 进程的双向管道,以将原始 POST 数据发送到它的 STDIN。我假设你已经收到了 PHP 的脚本输出。

    只要处理正常的浏览器请求,就不需要知道更多细节。否则,如果 POST 数据直接来自您的服务器,请使用上面的 CONTENT_TYPE 并对变量进行 url 编码:

    • REQUEST_METHOD=POST
    • CONTENT_LENGTH=16
    • HTTP_CONTENT_LENGTH=16
    • CONTENT_TYPE=application/x-www-form-urlencoded

    标准输入数据: test=Hello+world

    对于 GET 请求,您更改 REQUEST_METHOD=GET 并保留其他变量。无论哪种情况,您都可以通过 QUERY_STRING 环境变量传递查询字符串。

    【讨论】:

    • 非常感谢您的回复。我试图尊重你的建议,但是...... POST 请求对我不起作用 :( 我使用 2 个二进制文件。第一个加载环境变量:pastebin.com/XbaaxRWF 另一个调用 php 解释器:pastebin.com/XYLv1yjV 在这 2 个二进制文件之间,我们有一个管道旨在传输所有信息。你有什么想法吗?GET方法有效,谢谢你=D祝你有美好的一天。
    • 我没有时间查看您的源代码,但不要运行 PHP,而是尝试启动一个将环境变量和 STDIN 数据写入文本文件并检查的 shell 脚本(或类似脚本)那个数据。您也可以单独运行setcat,并在STDOUT 上获取信息。这样你就可以确定不是 PHP 拒绝工作,因为它的安全限制之一......
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多