以下是PHP-FPM(PHP 5.5)
with closure (obj_1, obj_2) as (
SELECT distinct t.obj_1, t.obj_2
FROM temp4 t
UNION ALL
SELECT c.obj_1, t.obj_2
FROM closure c, temp4 t
WHERE c.obj_2=t.obj_1)
SELECT * FROM closure
以下是mod_proxy_fcgi(Apache 2.4)
第一种方式
php-cgi.exe -b 127.0.0.1:9000
第二种方式
<Files ~ "\.(php|phtml)$">
SetHandler "proxy:fcgi://127.0.0.1:9000/"
</Files>
第三种方式
<LocationMatch ^(.*\.(php|phtml))$>
ProxyPass fcgi://127.0.0.1:9000/$1
</LocationMatch>
以上三种方式都会出现错误&#34;没有指定输入文件。&#34;谁知道为什么?我该怎么做才能解决这个问题?
答案 0 :(得分:7)
令人费解的是,只是将结尾/
更改为#
似乎可以解决问题:
<Files ~ "\.(php|phtml)$">
SetHandler "proxy:fcgi://127.0.0.1:9000#"
</Files>
在尝试理解这一点时,我将Apache设置为LogLevel debug
(为简洁起见,删除了时间戳/模块/流程详细信息):
使用/
给出:
mod_proxy_fcgi.c(911): [client ::1:60730] AH01076: url: fcgi://127.0.0.1:9000/E:/test/webroot/test.php proxyname: (null) proxyport: 0
mod_proxy_fcgi.c(920): [client ::1:60730] AH01078: serving URL fcgi://127.0.0.1:9000/E:/test/webroot/test.php
proxy_util.c(2154): AH00942: FCGI: has acquired connection for (*)
proxy_util.c(2208): [client ::1:60730] AH00944: connecting fcgi://127.0.0.1:9000/E:/test/webroot/test.php to 127.0.0.1:9000
proxy_util.c(2417): [client ::1:60730] AH00947: connected /E:/test/webroot/test.php to 127.0.0.1:9000
使用#
给出:
mod_proxy_fcgi.c(911): [client ::1:60738] AH01076: url: fcgi://127.0.0.1:9000#E:/test/webroot/test.php proxyname: (null) proxyport: 0
mod_proxy_fcgi.c(920): [client ::1:60738] AH01078: serving URL fcgi://127.0.0.1:9000#E:/test/webroot/test.php
proxy_util.c(2154): AH00942: FCGI: has acquired connection for (*)
proxy_util.c(2208): [client ::1:60738] AH00944: connecting fcgi://127.0.0.1:9000#E:/test/webroot/test.php to 127.0.0.1:9000
proxy_util.c(2417): [client ::1:60738] AH00947: connected to 127.0.0.1:9000
关键区别似乎是在最后一行,其中第二个(工作)方法似乎没有记录任何作为传递给PHP进程的值。
我无法解释这一点,无法在任何地方找到它。 (也许比我更愿意深入研究Apache和/或PHP来源进行调查。)
请注意,除了运行phpinfo()
之外,我没有对此进行测试,因此不建议将其用于生产服务器。
<强> 修改 强>
这适用于PHP 7.0,但是使用PHP 5.6,我仍然会收到“未指定输入文件”错误。
编辑2
使用Apache 2.4.25,但不是最近发布的2.4.26!
这似乎是CHANGES_2.4.26文件中明确提到的不兼容雷区:
mod_proxy_fcgi:返回2.4.20及之前的离开行为 SCRIPT_FILENAME环境变量中的“proxy:fcgi://”前缀 默认。添加ProxyFCGIBackendType以允许后端类型 指定这样可以在不影响的情况下恢复这些类型的修正 FPM。 PR60576 [Eric Covener,Jim Jagielski]
documentation已更新,以反映这一点:
根据此指令的设置更改的值的一个示例是SCRIPT_FILENAME。历史上使用mod_proxy_fcgi时,SCRIPT_FILENAME的前缀是字符串“proxy:fcgi://”。这个变量是一些通用的FastCGI应用程序将读取的脚本输入,但PHP-FPM会删除前缀,然后记住它正在与Apache交谈。在2.4.21到2.4.25中,服务器自动剥离了这个前缀,破坏了PHP-FPM在某些情况下检测和与Apache互操作的能力。
答案 1 :(得分:5)
我认为这是mod_proxy_fcgi中的一个错误,与Apache 2.4.12中解决的问题有关:
mod_proxy_fcgi:从SCRIPT_FILENAME中删除代理:balancer://前缀传递给fastcgi后端。 [Eric Covener]
不幸的是,它不够好,因为Apache正在向SCRIPT_FILENAME发送一个起始斜杠,类似于 \ c:\ fileName.php ,它不会被解析为本地文件名并且永远不会被执行。您可以使用在FastCGI端口上侦听的网络嗅探器(Wireshark)来验证这一点。
我很高兴看到这个问题正式解决,因为我不自信地重新编译Apache,所以我使用的是 apachelounge 的发行版。
答案 2 :(得分:2)
也许你没有把我弄好。
在修复之前,它是:代理:balancer:// \ c:\ fileName.php
修复后,它是: \ c:\ fileName.php
在Windows中哪些都是无效的文件名,而在认为Linux中没有驱动器号,因此它变为 \ fileName.php ,这是有效的。解决方法是删除起始斜杠并重新编译。
答案 3 :(得分:0)
按照以下指示的步骤通过FastCGI在Windows上的Apache下运行PHP时,我收到此错误:
https://www.orbitale.io/2017/11/11/apache-and-php-fpm-in-windows.html
在将php-cgi.exe设置为端口9000上的服务(使用NSSM)并将httpd.conf设置为以如下方式处理php文件后:
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
<Files ~ "\.php$">
SetHandler "proxy:fcgi://127.0.0.1:9000#"
</Files>
导航到localhost(其中包含带有简单<?php phpinfo(); ?>
的index.php)时,我也遇到相同的错误。
在尝试编辑定义了doc_root指令的php.ini之前,我一直很担心:
doc_root = C:\Apache24\htdocs
这样做并重新启动了我的Apache服务,瞧,我得到了php信息页面! 我正在使用PHP 7.3.5 NTS x64和Apache 2.4 x64。
答案 4 :(得分:0)
ProxyFCGIBackendType GENERIC 在httpd.conf中解决了我的问题!谢谢