2016-11-22 83 views
2

所以总之我试图让PHP脚本来侦听通过unix套接字的请求,并从另一个PHP脚本发送请求。 我已经配置PHP-FPM这样:PHP听unix套接字

[a] 

; Unix user/group of processes 
user = www 
group = www 

listen = /var/run/php-fpm-a.sock 
;listen.backlog = -1 

listen.owner = www 
listen.group = www 
listen.mode = 0660 

; Choose how the process manager will control the number of child processes. 
pm = dynamic 
pm.max_children = 75 
pm.start_servers = 3 
pm.min_spare_servers = 1 
pm.max_spare_servers = 5 
pm.max_requests = 500 

; host-specific php ini settings here 
php_admin_value[open_basedir] = /usr/local/www/a 
php_flag[display_errors] = on 
/usr/local/www/a contains the following index.php: 

<?php 
echo 'test\ntest\ntest\n'; 

有一个在/var/run/php-fpm-b.sock和Nginx的点,有效地听它(该位工作正常)另一个PHP-FPM配置文件,这包含在/usr/local/www/b/index.php下面的代码:

echo 'TEST B'; 
$fp = fsockopen('unix:///var/run/php-fpm-a.sock', -1, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET /index.php HTTP/1.1\r\n"; 
    $out .= "Host: localhost\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
    echo fgets($fp, 128); 
    } 

    fclose($fp); 
} 

显然,我有/usr/local/www/b/index.php出事了我得到的是“TEST B”作为输出。我不认为这是一个套接字权限问题,因为它会声明一个错误,我的猜测是$out这是错误的工作,但不知道什么PHP除了接收。任何帮助,将不胜感激。

注意:在使用上FreeBSD11

+0

Nginx使用'FastCGI'协议与PHP-FPM进程进行通信。为什么你想通过HTTP来做到这一点? –

+0

忽略Nginx,该部分工作正常,我基本上希望一个PHP脚本通过unix套接字连接到另一个脚本,就好像一个是客户端,另一个服务器如果可能则不通过Nginx。 – FireLeopard

+0

我的意思是,你必须使用'FastCGI'原型,同时与第二个脚本进行通信。 –

回答

2

PHP-FPM PHP7是FastCGI进程管理器。 FastCGIHTTP是两种不同的协议。所以,PHP-FPM 不能直接说HTTP

browser -> (HTTP) -> nginx -> (FastCGI) -> PHP-FPM + scriptB 
scriptB -> (HTTP) -> PHP-FPM + scriptA 

你有两个选择:

  • script A背后nginx的,然后打开TCP套接字,而不是Unix套接字从B到A的沟通
  • 修改script BFastCGI语言说话与script A而不是HTTP
+0

谢谢,我选择了第一个选项,考虑它比尝试过度设计它要好得多。我知道FastCGI和HTTP是不同的,但我想我只是希望PHP-FPM能理解这两者。 – FireLeopard

+0

不客气。但是,如果这个问题不是教育问题,我建议你使用'cURL'甚至'file_get_contents()'而不是手动打开套接字。 –

+0

@FireLeopard问题是'php-fpm'不是'http'服务器,因此它不需要理解'http'。说完'fastcgi'只允许你在任何** web服务器后放置一个或多个'php-fpm'服务器,无论是'nginx','apache',两者混合还是完全不同的东西。 HTTP服务器可以根据协议'http 1.1'或'http 2.0'进行调整,而不必升级'php-fpm'服务器。所有这些都有其原因,有一些方法可以将http转换为fcgi,但正如你所说 - 最好不要过度工程。 – Mjh