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

时间:2015-05-14 13:27:06

标签: php command-line-interface

我需要从命令行执行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)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:12)

您将需要可执行文件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标头,例如包含<?php echo "The time is ", date("H:i:s");的脚本:

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中,因此您需要像这样逃避&符:\&

另见: