如何使用 php5-fpm 池套接字执行 php 文件?

How to execute a php file using a php5-fpm pool socket?

我需要从命令行执行一个php脚本,但是如果我直接调用"php5 myfile.php",我会遇到一些安全问题(主要是openbasedir限制和用户和组权限)。

所以我想从与 fpm 进程 (/etc/php5/fpm/pool.d/specific_process.conf) 相同的约束条件下执行该 php 文件。这个进程在 /var/run/php5-fpm-specific.sock 有一个 sock 文件,我相信它会像在 conf 文件中一样受到限制(相同的用户和组,一些 php_admin_value,等等)。

但我看不出如何从命令行和给出一些参数来做到这一点。

我试过类似的东西:

php5 --bindpath /var/run/php5-fpm-specific.sock -f /path/to/my/file.php param1 param2

当然不行。我该怎么办?

注意:我调用的文件需要一些参数(这里是 param1param2)。

感谢您的帮助。

您将需要可执行文件 cgi-fcgi(在 libfcgi0ldbl 软件包的 Debian 部分),然后您可以通过执行此命令来完成它(这是 \ 转义的一行换行符,您应该可以像这样将其粘贴到您的 shell):

SCRIPT_NAME=/file.php \
SCRIPT_FILENAME=/path/to/my/file.php \
REQUEST_METHOD=GET \
QUERY_STRING=param1=x\&param2=y \
cgi-fcgi -bind -connect /var/run/php5-fpm-specific.sock

然后您将收到输出,因为它会被发送到 HTTP 服务器,因此它将包含 HTTP headers,例如对于包含 <?php echo "The time is ", date("H:i:s");:[=26= 的脚本]

Content-type: text/html

The time is 13:46:35

还有几个参数,但这些是最重要的参数(看看它们如何映射到 $_SERVER 数组,这就是后台发生的事情):

  • SCRIPT_NAME 这是从 HTTP 端看到的脚本名称。在我的示例中,可以通过 http://localhost/file.php
  • 访问文件
  • SCRIPT_FILENAME这是脚本的本地路径——HTTP服务器通常会根据URL来判断,这里需要自己指定
  • QUERY_STRING 如果你还想在 URL 中传递 ? 之后的内容,请注意我们在 shell 中],所以你需要像这样转义符号:\&

另请参阅: